DataAnnotationsLocalization для типа, расположенного в другой сборке в ASP.NET Core MVC 2.1 - PullRequest
0 голосов
/ 26 ноября 2018

Я пытаюсь использовать локализацию ресурсов в проекте 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; }
    }
}

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();
        }
    }
}

Вид:

@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>

Ресурсы

Структура проекта

Результат

1 Ответ

0 голосов
/ 26 ноября 2018

Прежде всего:

Путь к ресурсам определяется по следующему шаблону: {RootNamespace}.{ResourceLocation}.{FullTypeName - AssemblyName}, где
{RootNamespace} - это, в большинстве случаев, имя сборкитип, для которого ищется ресурс,
{ResourceLocation} - обычно это "Resources",
{FullTypeName - AssemblyName} - остаток от типа FullName.

Вы можете проверить это, введя тип IStringLocalazer<TestModel> в свой контроллер и получив доступ к индексатору с помощью ключа существующего ресурса (например, Value в вашем случае).
Свойство ResourceNotFound будетзначение true и SearchedLocation будут отражать путь, используемый для поиска ресурса.

Следовательно, файлы ресурсов модели должны быть размещены в той же сборке, где модель описывается тем же шаблоном пути:
LocalizedAspNetCoreApp.DomainModels/Resources/TestModel.resx

Если пространство имен типа будетдлиннее, чем имя сборки, оставшаяся часть должна быть добавлена ​​к имени файла ресурса.Например:
LocalizedAspNetCoreApp.DomainModels/Resources/Models.TestModel.resx

Во-вторых:

{ResourceLocation} по умолчанию инициализируется пустой строкой.Чтобы инициализировать это значение, установите пакет Microsoft.Extensions.Localization:

install-package Microsoft.Extensions.Localization

и измените метод ConfigureServices в Startup.cs:

    public void ConfigureServices(IServiceCollection services)
    {
        services
            .AddLocalization(opts => opts.ResourcesPath = "Resources")
            .AddMvc()
            .AddDataAnnotationsLocalization();
    }
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...