Come localizzare il messaggio di convalida (DataAnnotationsValidator) nel lato server di Blazor


10

Sto usando Blazor 3.1 nell'ultima versione di VS 2019.

finora sono in grado di localizzare le etichette delle pagine (titolo, campi tabella ecc.)

Nella ListEmployee.razorpagina sono in grado di localizzare l'intestazione della tabella ecc. E nella AddEmplyeeValidation.razorpagina sono in grado di localizzare le etichette dei moduli ma ho problemi a localizzare il messaggio di convalida.

per il messaggio di Employee.csconvalida per il messaggio di convalida sono definiti in questo file e Resources/Datacartella con il nome definito come Data.Employee.ar.resxe Data.Employee.ar.resxquesto non funziona

utilizzando System.ComponentModel.DataAnnotations;

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

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

}

Come posso come messaggio di convalida dai file di risorse in base alla lingua per il modulo Aggiungi dipendente.

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

Ho letto alcuni articoli e provato poche cose, ma nulla sembra funzionare

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

Sto usando il seguente esempio di Localizzazione, non mostra come localizzare il messaggio di errore https://www.c-sharpcorner.com/article/localization-in-blazor-server/

Immagine della struttura delle cartelle per riferimento

inserisci qui la descrizione dell'immagine

Esempio di file di risorse per la versione inglese allo stesso modo ho anche file arabo

inserisci qui la descrizione dell'immagine

Nella schermata seguente, il nome del campo viene estratto dal file di risorse, ma per il messaggio di convalida viene visualizzato solo in inglese perché non funziona

inserisci qui la descrizione dell'immagine

Risposte:


7

Ecco la mia soluzione per localizzare i messaggi di errore di annotazione dei dati. Creo due file di risorse, uno per i campi e un altro per i messaggi di errore.

  • DisplayNameResource per localizzare i campi
  • ErrorMessageResource per localizzare i messaggi di errore

inserisci qui la descrizione dell'immagine inserisci qui la descrizione dell'immagine inserisci qui la descrizione dell'immagine inserisci qui la descrizione dell'immagine

In vista la classe del modello usa l' Displayattributo per localizzare il nome del campo. Per specificare il file di risorse utilizzare la ResourceTypeproprietà sull'attributo Display:

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

E sugli attributi di convalida utilizzare ErrorMessageResourceNamee ErrorMessageResourceTypeper specificare il file di risorse:

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

Ecco un esempio 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; }
}

Il messaggio di errore per MaxLengthErrorè {0} cannot be longer than {1} character, quindi {0}verrà sostituito con il nome archiviato localizzato e {1}verrà sostituito con l' 256attributo specificato sull'attributo[StringLength(256,...


1
Lo proverò a quanto pare dovrebbe funzionare .. Gradirei se potessi pubblicare questo su Github poiché questo tipo o domanda verrà spesso sollevata e ci sono un numero enorme di opzioni multilingue ..
Imparare il

1
@Learning Metterò sicuramente l'esempio completo su github.
Mohsen Esmailpour,

Questo sarà di grande aiuto per molti programmatori come me poiché Blazor non ha molti esempi nel mio contesto ...
Imparare il

1

Questo è stato chiesto prima:

Come aggiungere la localizzazione ViewModel a Blazor?

Ho suggerito che l'uso di FluentValidation sarebbe un approccio migliore. Ecco un link al mio repository Github che dimostra come potrebbe funzionare:

https://github.com/conficient/BlazorValidationLocalization


Avevo in mente questo tipo di soluzione, ma ci saranno due file modali per ciascuno e se il progetto è grande diventerà difficile da gestire, sì, questo è un modo per aggirare e far funzionare le cose ...
Imparare il

Non sono sicuro di cosa intendi con "due file modali". Puoi ancora usare resx con FluentValidation. vedi fluentvalidation.net/localization
Quango

-1

Non l'ho provato!

Nei documenti ufficiali del nucleo di asp.net c'è una sezione su come localizzare DataAnnotations Forse troverai qualche indizio lì .


Sono nuovo del core di asp.net, ho provato cose diverse ma non ho funzionato prima di pubblicare queste domande, ho provato a cercare una soluzione da solo guardando un esempio, provando cose diverse ma non sembra funzionare nel mio caso ... è un po 'difficile vengo dal background di asp.net webform senza esperienza in asp.net MVC ... quindi il mio focus è solo sulle pagine Razor core di asp.net .. facci vedere
Imparare il
Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.