【问题标题】:AspNet Core Localizing Navigation ProertiesAsp Net Core 本地化导航属性
【发布时间】:2019-07-30 09:27:35
【问题描述】:

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

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 文件,这些文件反映了我的模型的文件和文件夹结构。

这是我的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>
                ...

【问题讨论】:

  • 你能说明你是如何在视图上渲染 AddressID 和 Line1 的吗?

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


【解决方案1】:

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

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

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

如果我的 ChildViewModel 不在 LocalizationTest.Models.ChildModel 命名空间中,这将不起作用。我把它放在了LocalizationTest.Models中,它没有工作。

【讨论】:

  • 我已经这样做了。 AddressViewModel.de-DE.resx 位于 Resources 文件夹的 AddressManagement 子文件夹内。我已经更新了我的问题中的图片以澄清这一点。
  • 顺便说一句,你确实说过你做了一些测试。您是否设法使 DataAnnotation 本地化与导航属性一起使用?如果是的话,你能以某种方式分享代码吗?
  • 嘿,是的,我的示例运行良好。稍后我可以与您分享。虽然我使用的有点不同,但我使用了 和 @Html.LabelFor(m => m.Address.AddressID) 并且都有效。
  • 我解决了。愚蠢的我在 AddressViewModel 的命名空间中输入了一个错字。我向上帝发誓...XD
【解决方案2】:

好吧,这对我来说很愚蠢,但无论如何我都会发布它。我的问题是我的AddressViewModel 的命名空间中有错字。不久前我们重命名了我们的项目,尽管我进行了搜索和替换,但我一定还是设法搞砸了。

【讨论】:

    猜你喜欢
    • 2018-11-30
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2016-12-14
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多