Cara melokalkan pesan validasi (DataAnnotationsValidator) di sisi server blazor

10

Saya menggunakan blazor 3.1 dalam versi terbaru dari VS 2019.

sejauh ini saya dapat melokalkan label halaman (judul, bidang tabel dll.)

Di ListEmployee.razorhalaman saya bisa melokalkan judul tabel dll. Dan pada AddEmplyeeValidation.razorhalaman saya bisa melokalkan label formulir tetapi saya punya masalah melokalisasi pesan validasi.

untuk pesan Validasi untuk pesan Employee.csvalidasi didefinisikan dalam file & Resources/Datafolder ini dengan nama yang ditentukan Data.Employee.ar.resxdan Data.Employee.ar.resxini tidak berfungsi

menggunakan System.ComponentModel.DataAnnotations;

namespace BlazorSPA1.Data {karyawan kelas publik {[MaxLength (50)] public string Id {get; set; }

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

}

Bagaimana saya bisa bagaimana memvalidasi pesan dari file Sumber Daya berdasarkan bahasa untuk formulir Tambahkan Karyawan.

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

Saya membaca beberapa artikel dan mencoba beberapa hal tetapi sepertinya tidak ada yang berhasil

Kode dalam 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;
    });

Saya menggunakan contoh berikut untuk Pelokalan, itu tidak menunjukkan bagaimana melokalkan pesan kesalahan https://www.c-sharpcorner.com/article/localization-in-blazor-server/

Gambar struktur folder untuk perbaikan

masukkan deskripsi gambar di sini

Contoh file sumber daya untuk versi bahasa Inggris dengan cara yang sama saya punya file Arab juga

masukkan deskripsi gambar di sini

Pada tangkapan layar di bawah ini Anda akan Nama bidang ditarik dari file Sumber Daya tetapi untuk pesan Validasi hanya ditampilkan dalam Bahasa Inggris karena tidak berfungsi

masukkan deskripsi gambar di sini

Belajar
sumber

Jawaban:

7

Inilah solusi saya untuk melokalkan pesan kesalahan anotasi data. Saya membuat dua file sumber daya, satu untuk bidang dan satu lagi untuk pesan kesalahan.

  • DisplayNameResource untuk bidang pelokalan
  • ErrorMessageResource untuk melokalkan pesan kesalahan

masukkan deskripsi gambar di sini masukkan deskripsi gambar di sini masukkan deskripsi gambar di sini masukkan deskripsi gambar di sini

Dalam model tampilan, gunakan Displayatribut untuk melokalisasi nama bidang. Untuk menentukan file sumber daya gunakan ResourceTypeproperti pada Displayatribut:

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

Dan pada atribut validasi gunakan ErrorMessageResourceNamedan ErrorMessageResourceTypeuntuk menentukan file sumber daya:

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

Ini adalah contoh lengkapnya:

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

Pesan galat MaxLengthErroradalah {0} cannot be longer than {1} character, jadi {0}akan diganti dengan nama yang diajukan dan {1}akan diganti dengan 256atribut yang Anda tentukan pada atribut[StringLength(256,...

Mohsen Esmailpour
sumber
1
Saya akan mencoba ini sepertinya ini akan berhasil .. Saya akan sangat menghargai jika Anda dapat memposting ini di Github karena jenis atau pertanyaan ini akan sering muncul dan ada banyak pilihan multibahasa.
Belajar
1
@Pelajaran, saya akan memberikan contoh lengkap tentang github.
Mohsen Esmailpour
Ini akan sangat membantu bagi banyak programmer seperti saya karena Blazor tidak punya banyak contoh dalam konteks saya ...
Belajar
1

Ini telah ditanyakan sebelumnya:

Bagaimana cara menambahkan lokalisasi ViewModel ke Blazor?

Saya menyarankan agar menggunakan FluentValidation akan menjadi pendekatan yang lebih baik. Berikut ini tautan ke repo Github saya yang menunjukkan cara kerjanya:

https://github.com/conficient/BlazorValidationLocalization

Quango
sumber
Saya memiliki solusi semacam ini dalam pikiran tetapi ini akan dua file modal untuk masing-masing dan jika proyek besar itu akan menjadi sulit untuk dikelola, Ya ini adalah pekerjaan di sekitar dan membuat sesuatu bekerja ...
Belajar
Tidak yakin apa yang Anda maksud dengan "dua file modal". Anda masih dapat menggunakan resx dengan FluentValidation. lihat fluentvalidation.net/localization
Quango
-1

Saya tidak mencoba ini!

Dalam dokumen resmi inti asp.net ada bagian cara melokalkan DataAnnotations Mungkin Anda menemukan beberapa petunjuk di sana .

Zsolt Bendes
sumber
Saya baru mengenal inti asp.net saya mencoba hal yang berbeda tetapi tidak berhasil sebelum memposting pertanyaan ini saya mencoba mencari solusi sendiri pada contoh saya, mencoba hal yang berbeda tetapi tampaknya tidak berfungsi untuk kasus saya ... agak sulit Saya dari latar belakang webform asp.net tanpa pengalaman di asp.net MVC ... jadi fokus saya adalah menuju halaman asp.net core Razor saja .. mari kita lihat
Belajar