AspNet核心本地化导航属性

时间:2019-07-30 09:27:35

标签: asp.net-core localization data-annotations navigation-properties

我正在尝试在模型中定位导航属性。简单属性可以很好地工作,但是由于某些原因,我用于本地化这些属性的架构不适用于nav属性。

services.AddLocalization(opts => { opts.ResourcesPath = "Resources"; });
services.AddMvc()
    .SetCompatibilityVersion(CompatibilityVersion.Version_2_1)
    .AddViewLocalization(
        LanguageViewLocationExpanderFormat.Suffix,
        opts => { opts.ResourcesPath = "Resources"; })
    .AddDataAnnotationsLocalization();
services.Configure<RequestLocalizationOptions>(
opts =>
{
    var supportedCultures = new List<CultureInfo>
    {
        new CultureInfo("en-US"),
        new CultureInfo("de-DE")
    };

    opts.DefaultRequestCulture = new RequestCulture("de-DE");
    opts.SupportedCultures = supportedCultures;
    opts.SupportedUICultures = supportedCultures;
    opts.RequestCultureProviders = new List<IRequestCultureProvider>
    {
        new QueryStringRequestCultureProvider(),
        new CookieRequestCultureProvider()
    };
});

这是我配置本地化的方式。然后,我创建了一个文件夹Resources,并在其中创建了一堆.resx文件,这些文件反映了模型的文件和文件夹结构。

enter image description here

enter image description here

这是我的CompanyViewModel

public class CompanyViewModel
{
    [DisplayName("CompanyID")]
    public int CompanyID { get; set; }

    //...

    public AddressViewModel Address { get; set; }
}

这是对应的AddressViewModel

public class AddressViewModel
{
    [DisplayName("AddressID")]
    public int AddressID { get; set; }

    [DisplayName("Line1")]
    [Required(ErrorMessage = "Required")]
    public string Line1 { get; set; }

    //...
}

似乎不管做什么,当我在视图中显示Address属性时,它不会显示本地化的字符串,而只会显示属性名称。我尝试使用多种命名方案,例如Address.Lin1或创建资源,例如CompanyViewModel.Address.de-DE.resx。但是除了属性名称之外,我什么也不会显示。

有人可以在这里向我指出正确的方向吗?

编辑:这是我渲染AddressViewModel的方式:

<p>
    <input type="hidden" asp-for="@Model.Address.AddressID" />
    <div class="card">
        <div class="card-header">
            @Localizer["AddressDetails"]
        </div>
        <div class="card-body">
            <dl class="form-row">
                <dt class="form-group col-md-6">
                    @Html.DisplayNameFor(model => model.Address.Line1)
                </dt>
                <dd class="form-group col-md-6">
                    @Html.DisplayFor(model => model.Address.Line1)
                </dd>
                ...

2 个答案:

答案 0 :(得分:1)

经过一些测试,我会说您实际上是将本地化字符串保留在错误的resx文件中。与AddressViewModel相关的本地化应该位于AddressViewModel.resx中与您的AddressViewModel相同的存储路径中,而不管AddressViewModel是CompanyViewModel的属性。

经过进一步的测试,我注意到如果名称空间与resx文件夹结构不同,则本地化将不起作用。

所以在我的示例中,我具有以下结构:

enter image description here

如果我的ChildViewModel不在LocalizationTest.Models.ChildModel命名空间中,则该方法不起作用。我把它放在LocalizationTest.Models中,但没有用。

答案 1 :(得分:0)

好吧,这对我来说很愚蠢,但是我还是要把它张贴出来。我的问题是我的AddressViewModel的命名空间中有错字。不久前,我们将项目重命名,尽管我进行了搜索和替换,但我仍必须设法解决该问题。