Jak zlokalizować komunikat sprawdzania poprawności (DataAnnotationsValidator) po stronie serwera blazor

10

Korzystam z blazor 3.1 w najnowszej wersji VS 2019.

do tej pory jestem w stanie zlokalizować etykiety stron (tytuł, pola tabeli itp.)

Na ListEmployee.razorstronie jestem w stanie zlokalizować nagłówek tabeli itp., A na AddEmplyeeValidation.razorstronie jestem w stanie zlokalizować etykiety formularzy, ale mam problem ze zlokalizowaniem komunikatu sprawdzającego poprawność.

dla wiadomości Employee.cssprawdzania poprawności dla wiadomości sprawdzania poprawności są zdefiniowane w tym pliku i Resources/Datafolderze o nazwie zdefiniowanej jako Data.Employee.ar.resxi Data.Employee.ar.resxto nie działa

using System.ComponentModel.DataAnnotations;

przestrzeń nazw BlazorSPA1.Data {public class Employee {[MaxLength (50)] public string Id {get; zestaw; }

    [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; }
}

}

Jak mogę dowiedzieć się, w jaki sposób komunikat sprawdzania poprawności z plików zasobów w oparciu o język formularza Dodaj pracownika.

@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");
    }
}   

Przeczytałem kilka artykułów i próbowałem kilku rzeczy, ale wydaje się, że nic nie działa

Kod w 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;
    });

Korzystam z następującego przykładu dla lokalizacji, nie pokazuje, jak zlokalizować komunikat o błędzie https://www.c-sharpcorner.com/article/localization-in-blazor-server/

Obraz struktury folderów do odwołania

wprowadź opis zdjęcia tutaj

Przykład pliku zasobów dla wersji angielskiej w taki sam sposób, jak mam plik arabski

wprowadź opis zdjęcia tutaj

Na poniższym zrzucie ekranu nazwa pola jest pobierana z pliku zasobów, ale w przypadku walidacji komunikat jest wyświetlany tylko w języku angielskim, ponieważ nie działa

wprowadź opis zdjęcia tutaj

Uczenie się
źródło

Odpowiedzi:

7

Oto moje rozwiązanie do lokalizowania komunikatów o błędach adnotacji danych. Tworzę dwa pliki zasobów, jeden dla pól, a drugi dla komunikatów o błędach.

  • DisplayNameResource do lokalizowania pól
  • ErrorMessageResource do lokalizowania komunikatów o błędach

wprowadź opis zdjęcia tutaj wprowadź opis zdjęcia tutaj wprowadź opis zdjęcia tutaj wprowadź opis zdjęcia tutaj

W widoku modelu klasy użyj Displayatrybutu do zlokalizowania nazwy pola. Aby określić plik zasobów, należy użyć ResourceTypewłaściwości Displayatrybutu:

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

A przy użyciu atrybutów sprawdzania poprawności ErrorMessageResourceNamei ErrorMessageResourceTypedo określenia pliku zasobów:

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

Oto pełny przykład:

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

Komunikat o błędzie MaxLengthErrorto {0} cannot be longer than {1} character, więc {0}zostanie zastąpiony zlokalizowaną nazwą pliku i {1}zostanie zastąpiony 256podanym w atrybucie[StringLength(256,...

Mohsen Esmailpour
źródło
1
Spróbuję tego, wydaje się, że powinno działać. Byłbym wdzięczny, gdybyś mógł opublikować to na Github, ponieważ tego rodzaju pytania lub pytania często się pojawiają i istnieje ogromna liczba wielojęzycznych opcji ..
Nauka
1
@Learning Na pewno dam pełny przykład na github.
Mohsen Esmailpour
Będzie to bardzo pomocne dla wielu programistów takich jak ja, ponieważ Blazor nie ma wiele przykładów w moim kontekście ...
Nauka
1

Zostało to zadane wcześniej:

Jak dodać lokalizację ViewModel do Blazora?

Zasugerowałem, że lepszym rozwiązaniem byłoby użycie FluentValidation. Oto link do mojego repozytorium Github, który pokazuje, jak to może działać:

https://github.com/conficient/BlazorValidationLocalization

Quango
źródło
Miałem na myśli tego rodzaju rozwiązanie, ale będą to dwa pliki modalne dla każdego, a jeśli projekt będzie duży, zarządzanie nim będzie utrudnione. Tak, to jest obejście i sprawienie, by działało ...
Nauka
Nie jestem pewien, co rozumiesz przez „dwa pliki modalne”. Nadal możesz używać resx z FluentValidation. patrz fluentvalidation.net/localization
Quango
-1

Nie wypróbowałem tego!

W oficjalnych dokumentach asp.net core znajduje się sekcja jak zlokalizować DataAnnotations Być może znajdziesz tam jakieś wskazówki .

Zsolt Bendes
źródło
Jestem nowy w rdzeniu asp.net. Próbowałem innej rzeczy, ale nie działałem przed opublikowaniem tych pytań. Próbowałem szukać rozwiązania na swój własny przykład, próbuję innej rzeczy, ale wydaje się, że to nie działa w moim przypadku ... to trochę trudne. Jestem z tła formularza www asp.net bez doświadczenia w asp.net MVC ... więc skupiam się tylko na stronach rdzenia asp.net core. zobaczmy
Nauka