DataAnnotationsLocalization位于ASP.NET Core MVC 2.1中另一个程序集中的类型

W. *_*rew 6 resx data-annotations asp.net-core

我正在尝试使用ASP.NET Core MVC 2.1项目中的资源本地化来配置验证错误消息,如本文所述.

我想根据洋葱架构在我的项目中分离组件,模型是在一个单独的组件中.因此,模型名称空间与主机应用程序名称空间不同.如上所述这里,我呼吁通过完整的类型名称我的资源文件.

但是,不会根据资源文件替换模型属性的消息.

我究竟做错了什么?

细节:

模型:

using System.ComponentModel.DataAnnotations;

namespace LocalizedAspNetCoreApp.DomainModels
{
    public class TestModel
    {
        [Display(Name = "Value")]
        [Required(ErrorMessage = "ValueRequired")]
        public string Value { get; set; }
    }
}
Run Code Online (Sandbox Code Playgroud)

Sturtup.cs:

using Microsoft.AspNetCore.Builder;
using Microsoft.AspNetCore.Hosting;
using Microsoft.Extensions.Configuration;
using Microsoft.Extensions.DependencyInjection;

namespace LocalizedAspNetCoreApp.Host
{
    public class Startup
    {
        public Startup(IConfiguration configuration)
        {
            Configuration = configuration;
        }

        public IConfiguration Configuration { get; }

        public void ConfigureServices(IServiceCollection services)
        {
            services.AddMvc()
                .AddDataAnnotationsLocalization();
        }

        public void Configure(IApplicationBuilder app, IHostingEnvironment env)
        {
            if (env.IsDevelopment())
            {
                app.UseDeveloperExceptionPage();
            }
            else
            {
                app.UseExceptionHandler("/Home/Error");
            }

            app.UseStaticFiles();

            app.UseMvcWithDefaultRoute();
        }
    }
}
Run Code Online (Sandbox Code Playgroud)

视图:

@model TestModel;
@{
    ViewData["Title"] = "About";
}
<h2>@ViewData["Title"]</h2>
<h3>@ViewData["Message"]</h3>

<form method="post" asp-controller="Home" asp-action="About">
    <div asp-validation-summary="ModelOnly"></div>
    <div>
        <label asp-for="Value"></label>
        <input asp-for="Value" />
        <span asp-validation-for="Value"></span>
    </div>
    <div>
        <input type="submit" value="Save" />
    </div>
</form>
Run Code Online (Sandbox Code Playgroud)

资源

项目结构

结果

Vla*_*nov 7

首先:

对资源的路径是按照下面的模板来确定:{RootNamespace}.{ResourceLocation}.{FullTypeName - AssemblyName}其中
{RootNamespace},在大多数情况下,该类型的程序集的名称为资源被搜查,
{ResourceLocation}-这通常"Resources",
{FullTypeName - AssemblyName}是类型全名的其余部分.

您可以通过将类型IStringLocalazer<TestModel>注入控制器并使用现有资源的键访问索引器来验证这一点(例如,在您的情况下为Value).
ResourceNotFound属性将被设置为trueSearchedLocation反映用于查找资源的路径.

因此,模型资源文件应放在同一个程序集中,其中模型由相同的路径模式描述:
LocalizedAspNetCoreApp.DomainModels/Resources/TestModel.resx

如果类型的命名空间长于Assembly的名称,则应将剩余部分添加到资源的文件名中.例如:
LocalizedAspNetCoreApp.DomainModels/Resources/Models.TestModel.resx

其次:

{ResourceLocation}默认情况下使用空字符串进行初始化.要初始化此值,请安装包Microsoft.Extensions.Localization:

install-package Microsoft.Extensions.Localization

并在Startup.cs中更改ConfigureServices方法:

    public void ConfigureServices(IServiceCollection services)
    {
        services
            .AddLocalization(opts => opts.ResourcesPath = "Resources")
            .AddMvc()
            .AddDataAnnotationsLocalization();
    }
Run Code Online (Sandbox Code Playgroud)