Lokalisieren der Validierungsnachricht (DataAnnotationsValidator) auf der Blazor-Serverseite

10

Ich verwende Blazor 3.1 in der neuesten Version von VS 2019.

Bisher kann ich Seitenbeschriftungen (Titel, Tabellenfelder usw.) lokalisieren.

Auf ListEmployee.razorSeite kann ich Tabellenüberschriften usw. lokalisieren und auf AddEmplyeeValidation.razorSeite kann ich Formularbezeichnungen lokalisieren, aber ich habe Probleme beim Lokalisieren der Validierungsnachricht.

for Validation-Nachricht für Employee.csValidierungsnachricht werden in dieser Datei und in diesem Resources/DataOrdner mit dem Namen definiert, der als definiert ist, Data.Employee.ar.resxund Data.Employee.ar.resxdies funktioniert nicht

using System.ComponentModel.DataAnnotations;

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

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

}}

Wie kann ich wie Validierungsnachricht aus Ressourcendateien basierend auf der Sprache für das Formular "Mitarbeiter hinzufügen".

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

Ich habe einige Artikel gelesen und einige Dinge ausprobiert, aber nichts scheint zu funktionieren

Code in 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;
    });

Ich verwende das folgende Beispiel für die Lokalisierung. Es zeigt nicht, wie die Fehlermeldung https://www.c-sharpcorner.com/article/localization-in-blazor-server/ lokalisiert wird.

Ordnerstrukturbild zur Auffrischung

Geben Sie hier die Bildbeschreibung ein

Beispiel für eine Ressourcendatei für die englische Version, genauso wie ich auch eine arabische Datei habe

Geben Sie hier die Bildbeschreibung ein

Im folgenden Screenshot sehen Sie, dass der Feldname aus der Ressourcendatei abgerufen wird. Die Meldung zur Validierung wird jedoch nur auf Englisch angezeigt, da sie nicht funktioniert

Geben Sie hier die Bildbeschreibung ein

Lernen
quelle

Antworten:

7

Hier ist meine Lösung zum Lokalisieren von Datenanmerkungsfehlermeldungen. Ich erstelle zwei Ressourcendateien, eine für Felder und eine für Fehlermeldungen.

  • DisplayNameResource zum Lokalisieren von Feldern
  • ErrorMessageResource zum Lokalisieren von Fehlermeldungen

Geben Sie hier die Bildbeschreibung ein Geben Sie hier die Bildbeschreibung ein Geben Sie hier die Bildbeschreibung ein Geben Sie hier die Bildbeschreibung ein

Verwenden Sie in der Ansichtsmodellklasse das DisplayAttribut zum Lokalisieren des Feldnamens. Um die Ressourcendatei anzugeben, verwenden Sie die ResourceTypeEigenschaft on Displayattribute:

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

Und bei Validierungsattributen verwenden Sie ErrorMessageResourceNameund ErrorMessageResourceTypegeben Sie die Ressourcendatei an:

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

Hier ist ein vollständiges Beispiel:

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

Fehlermeldung MaxLengthErrorheißt {0} cannot be longer than {1} character, so {0}wird mit lokalisierten eingereicht Namen ersetzt und {1}wird ersetzt werden durch das 256Sie auf Attribut angegeben[StringLength(256,...

Mohsen Esmailpour
quelle
1
Ich werde es ausprobieren, es scheint, als sollte es funktionieren. Ich würde mich freuen, wenn Sie dies auf Github posten könnten, da diese Art oder Frage oft aufgeworfen wird und es eine große Anzahl mehrsprachiger Optionen gibt.
Lernen
1
@Learning Ich werde mit Sicherheit ein vollständiges Beispiel für Github geben.
Mohsen Esmailpour
Dies wird vielen Programmierern wie mir eine große Hilfe sein, da Blazor nicht viel Beispiel in meinem Kontext hat ...
Lernen
1

Dies wurde schon einmal gefragt:

Wie füge ich Blazor die ViewModel-Lokalisierung hinzu?

Ich schlug vor, dass die Verwendung von FluentValidation ein besserer Ansatz wäre. Hier ist ein Link zu meinem Github-Repo, der zeigt, wie es funktionieren könnte:

https://github.com/conficient/BlazorValidationLocalization

Quango
quelle
Ich hatte diese Art von Lösung im Sinn, aber dies werden zwei Modaldateien für jede sein, und wenn das Projekt groß ist, wird es schwierig, es zu verwalten. Ja, dies ist eine Problemumgehung und bringt die Sache zum Laufen ...
Lernen
Nicht ganz sicher, was Sie unter "zwei modalen Dateien" verstehen. Sie können resx weiterhin mit FluentValidation verwenden. siehe fluentvalidation.net/localization
Quango
-1

Ich habe das nicht ausprobiert!

In den offiziellen Dokumenten von asp.net core gibt es einen Abschnitt zum Lokalisieren. DataAnnotations Vielleicht finden Sie dort einige Hinweise .

Zsolt Bendes
quelle
Ich bin neu in asp.net core. Ich habe etwas anderes ausprobiert, aber es hat nicht funktioniert, bevor ich diese Fragen gestellt habe. Ich habe versucht, selbst nach einer Lösung zu suchen. Ich habe ein anderes Beispiel ausprobiert, aber es scheint für meinen Fall nicht zu funktionieren. Es ist ein bisschen schwierig Ich komme aus dem asp.net-Webform-Hintergrund und habe keine Erfahrung mit asp.net MVC. Mein Fokus liegt also nur auf den asp.net-Kern-Rasiermesserseiten. Lassen Sie uns sehen
Lernen