Como localizar a mensagem de validação (DataAnnotationsValidator) no lado do servidor blazor

10

Estou usando o blazor 3.1 na versão mais recente do VS 2019.

até agora eu sou capaz de localizar os rótulos das páginas (título, campos da tabela etc.)

Na ListEmployee.razorpágina, localizo o cabeçalho da tabela, etc., e na AddEmplyeeValidation.razorpágina, localizo os rótulos dos formulários, mas tenho problemas para localizar a mensagem de validação.

para mensagem de Employee.csvalidação para mensagem de validação são definidas neste arquivo e Resources/Datapasta com o nome definido como Data.Employee.ar.resxe Data.Employee.ar.resxisso não está funcionando

using System.ComponentModel.DataAnnotations;

namespace BlazorSPA1.Data {public class Employee {[MaxLength (50)] public string Id {get; conjunto; }

    [Required (ErrorMessage ="Name is RRRequired")]
    [StringLength(20, ErrorMessage = "Name is too long.")]
    public string Name { get; set; }

    [Required]
    [StringLength(20)]
    public string Department { get; set; }
    [MaxLength(100)]
    public string Designation { get; set; }
    [MaxLength(100)]
    public string Company { get; set; }
    [MaxLength(100)]
    public string City { get; set; }
}

}

Como posso como mensagem de validação de arquivos de recursos com base no idioma para o formulário Adicionar funcionário.

@page "/addemployeeValidation"
@inject NavigationManager NavigationManager
@inject IEmployeeService EmployeeService
@inject IStringLocalizer<AddEmployeeValidation> L

<h2>Create Employee</h2>
<hr />
<EditForm Model="@employee" OnValidSubmit="@CreateEmployee">
    <DataAnnotationsValidator />
    <ValidationSummary />
    <div class="row">
        <div class="col-md-8">
            <div class="form-group">
                <label for="Name" class="control-label">@L["Name"]</label>
                <input for="Name" class="form-control" @bind="@employee.Name" />
                <ValidationMessage For="@(()=> employee.Name)" />
            </div>
            <div class="form-group">
                <label for="Department" class="control-label">@L["Department"]</label>
                <input for="Department" class="form-control" @bind="@employee.Department" />
            </div>
            <div class="form-group">
                <label for="Designation" class="control-label">@L["Designation"]</label>
                <input for="Designation" class="form-control" @bind="@employee.Designation" />
            </div>
            <div class="form-group">
                <label for="Company" class="control-label">@L["Company"]</label>
                <input for="Company" class="form-control" @bind="@employee.Company" />
            </div>
            <div class="form-group">
                <label for="City" class="control-label">@L["City"]</label>
                <input for="City" class="form-control" @bind="@employee.City" />
            </div>
        </div>
    </div>
    <div class="row">
        <div class="col-md-4">
            <div class="form-group">
                <input type="submit" class="btn btn-primary" value="Save" />
                <input type="button" class="btn" @onclick="@Cancel" value="Cancel" />
            </div>
        </div>
    </div>
</EditForm>

@code {

    Employee employee = new Employee();

    protected async Task CreateEmployee()
    {
        await EmployeeService.CreateEmployee(employee);
        NavigationManager.NavigateTo("listemployees");
    }


    void Cancel()
    {
        NavigationManager.NavigateTo("listemployees");
    }
}   

Eu li alguns artigos e tentei poucas coisas, mas nada parece estar funcionando

Código em Startup.cs`

services.AddServerSideBlazor (options => options.DetailedErrors = true);

    services.AddLocalization(options => options.ResourcesPath = "Resources");
    var supportedCultures = new List<CultureInfo> { new CultureInfo("en"), new CultureInfo("ar") };
    services.Configure<RequestLocalizationOptions>(options =>
    {
        options.DefaultRequestCulture = new Microsoft.AspNetCore.Localization.RequestCulture("en");
        options.SupportedUICultures = supportedCultures;
    });

Estou usando o exemplo a seguir para Localização, ele não mostra como localizar a mensagem de erro https://www.c-sharpcorner.com/article/localization-in-blazor-server/

Imagem da estrutura de pastas para referência

insira a descrição da imagem aqui

Exemplo de arquivo de recurso para a versão em inglês da mesma maneira que eu tenho o arquivo em árabe também

insira a descrição da imagem aqui

Na captura de tela abaixo, o nome do campo está sendo retirado do arquivo de recursos, mas a mensagem de validação é exibida apenas em inglês, pois não está funcionando

insira a descrição da imagem aqui

Aprendendo
fonte

Respostas:

7

Aqui está minha solução para localizar mensagens de erro de anotação de dados. Crio dois arquivos de recursos, um para campos e outro para mensagens de erro.

  • DisplayNameResource para localização de campos
  • ErrorMessageResource para localizar mensagens de erro

insira a descrição da imagem aqui insira a descrição da imagem aqui insira a descrição da imagem aqui insira a descrição da imagem aqui

Na classe de modelo de exibição, use o Displayatributo para localizar o nome do campo. Para especificar o arquivo de recurso, use a ResourceTypepropriedade no Displayatributo:

[Display(Name = "Address", ResourceType = typeof(DisplayNameResource))]

E nos atributos de validação, use ErrorMessageResourceNamee ErrorMessageResourceTypepara especificar o arquivo de recurso:

[Required(ErrorMessageResourceName = "RequiredError", ErrorMessageResourceType = typeof(ErrorMessageResource))]

Aqui está um exemplo completo:

public class SomeViewModel
{
    [Display(Name = "Address", ResourceType = typeof(DisplayNameResource))]
    [Required(ErrorMessageResourceName = "RequiredError", ErrorMessageResourceType = typeof(ErrorMessageResource))]
    [StringLength(256, ErrorMessageResourceName = "MaxLengthError", ErrorMessageResourceType = typeof(ErrorMessageResource))]
    public string Address { get; set; }

    [Display(Name = "Phone", ResourceType = typeof(DisplayNameResource))]
    [Required(ErrorMessageResourceName = "RequiredError", ErrorMessageResourceType = typeof(ErrorMessageResource))]
    [RegularExpression("^09([0-9]{9})$", ErrorMessageResourceName = "PhoneLengthError", ErrorMessageResourceType = typeof(ErrorMessageResource))]
    public string Phone { get; set; }

    [Display(Name = "Password", ResourceType = typeof(DisplayNameResource))]
    [Required(ErrorMessageResourceName = "RequiredError", ErrorMessageResourceType = typeof(ErrorMessageResource))]
    [StringLength(50, MinimumLength = 6, ErrorMessageResourceType = typeof(ErrorMessageResource), ErrorMessageResourceName = "MinxMaxLengthError")]
    public string Password { get; set; }

    [Display(Name = "ConfirmPassword", ResourceType = typeof(DisplayNameResource))]
    [Required(ErrorMessageResourceName = "RequiredError", ErrorMessageResourceType = typeof(ErrorMessageResource))]
    [StringLength(50, MinimumLength = 6, ErrorMessageResourceType = typeof(ErrorMessageResource), ErrorMessageResourceName = "MinxMaxLengthError")]
    [Compare("Password", ErrorMessageResourceName = "PasswordConfirmMisMatch", ErrorMessageResourceType = typeof(ErrorMessageResource))]
    public string ConfirmPassword { get; set; }
}

Mensagem de erro de MaxLengthErroré {0} cannot be longer than {1} character, por isso, {0}será substituído com o nome arquivado localizada e {1}será substituído com o 256especificado na atributo[StringLength(256,...

Mohsen Esmailpour
fonte
11
Vou tentar isso, parece que deve funcionar .. Eu apreciaria se você pudesse postar isso no Github, pois esse tipo ou pergunta é frequentemente levantada e há um grande número de opções multilíngues ..
Aprendendo
11
@ Learning Vou colocar um exemplo completo no github, com certeza.
Mohsen Esmailpour 19/01
Isso será de grande ajuda para muitos programadores como eu, pois o Blazor não tem muito exemplo no meu contexto ...
Aprendendo
1

Isso já foi perguntado antes:

Como adicionar a localização do ViewModel ao Blazor?

Sugeri que usar o FluentValidation seria uma abordagem melhor. Aqui está um link para meu repositório do Github que demonstra como ele poderia funcionar:

https://github.com/conficient/BlazorValidationLocalization

Quango
fonte
Eu tinha esse tipo de solução em mente, mas isso incluiria dois arquivos modais para cada um e, se o projeto for grande, será difícil gerenciar, sim, isso é uma solução alternativa e fará as coisas funcionarem ...
Aprendendo
Não tenho certeza do que você quer dizer com "dois arquivos modais". Você ainda pode usar o resx com FluentValidation. veja fluentvalidation.net/localization
Quango
-1

Eu não tentei isso!

Nos documentos oficiais do núcleo do asp.net, há uma seção sobre como localizar DataAnnotations Talvez você encontre algumas pistas lá .

Zsolt Bendes
fonte
Eu sou novo no núcleo do asp.net. Tentei algo diferente, mas não trabalhei antes de postar essas perguntas. Tentei procurar solução sozinho, por exemplo, tentando algo diferente, mas ele não parece funcionar no meu caso ... um pouco difícil eu sou do fundo do formulário web asp.net sem experiência no asp.net MVC ... então meu foco é apenas nas páginas principais do asp.net Razor .. vamos ver
Learning