Cách bản địa hóa thông báo xác thực (DataAnnotationsValidator) ở phía máy chủ blazor


10

Tôi đang sử dụng blazor 3.1 trong phiên bản mới nhất của VS 2019.

cho đến nay tôi có thể bản địa hóa nhãn trang (tiêu đề, trường bảng, v.v.)

Trong ListEmployee.razortrang tôi có thể bản địa hóa tiêu đề bảng, v.v. và trên AddEmplyeeValidation.razortrang tôi có thể Bản địa hóa nhãn biểu mẫu nhưng tôi gặp vấn đề trong việc bản địa hóa thông báo xác thực.

đối với thông báo Xác thực cho thông báo Employee.csxác thực được xác định trong tệp & Resources/Datathư mục này với tên được xác định là Data.Employee.ar.resxData.Employee.ar.resxđiều này không hoạt động

sử dụng System.ComponentModel.DataAnnotations;

không gian tên BlazorSPA1.Data {lớp công khai Nhân viên {[MaxLạng (50)] chuỗi công khai Id {get; bộ; }

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

}

Làm thế nào tôi có thể thông báo xác thực từ các tệp Tài nguyên dựa trên ngôn ngữ cho biểu mẫu Thêm nhân viên.

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

Tôi đọc vài bài báo và thử vài thứ nhưng dường như không có gì hiệu quả

Mã trong Startup.cs`

services.AddServerSideBlazor (tùy chọn => tùy chọn.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;
    });

Tôi đang sử dụng ví dụ sau để Bản địa hóa, nó không hiển thị cách bản địa hóa thông báo lỗi https://www.c-sharpcorner.com/article/localization-in-blazor-server/

Hình ảnh cấu trúc thư mục cho sự điều chỉnh

nhập mô tả hình ảnh ở đây

Ví dụ về tệp tài nguyên cho phiên bản tiếng Anh giống như cách tôi có tệp tiếng Ả Rập

nhập mô tả hình ảnh ở đây

Trong ảnh chụp màn hình bên dưới, tên trường của bạn sẽ được kéo từ tệp Tài nguyên nhưng đối với thông báo Xác thực chỉ hiển thị bằng tiếng Anh vì nó không hoạt động

nhập mô tả hình ảnh ở đây

Câu trả lời:


7

Đây là giải pháp của tôi để bản địa hóa các thông báo lỗi chú thích dữ liệu. Tôi tạo hai tệp tài nguyên, một cho các trường và một cho các thông báo lỗi.

  • DisplayNameResource để bản địa hóa các lĩnh vực
  • ErrorMessageResource để bản địa hóa các thông báo lỗi

nhập mô tả hình ảnh ở đây nhập mô tả hình ảnh ở đây nhập mô tả hình ảnh ở đây nhập mô tả hình ảnh ở đây

Trong lớp mô hình xem sử dụng Displaythuộc tính để bản địa hóa tên trường. Để chỉ định tệp tài nguyên sử dụng thuộc tính ResourceTypetrên Displaythuộc tính:

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

Và trên các thuộc tính xác nhận sử dụng ErrorMessageResourceNameErrorMessageResourceTypeđể chỉ định tệp tài nguyên:

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

Dưới đây là ví dụ đầy đủ:

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

Thông báo lỗi cho MaxLengthError{0} cannot be longer than {1} character, do đó {0}sẽ được thay thế bằng tên nộp cục bộ và {1}sẽ được thay thế bằng 256thuộc tính bạn đã chỉ định trên[StringLength(256,...


1
Tôi sẽ thử điều này có vẻ như nó sẽ hoạt động .. Tôi sẽ đánh giá cao nếu bạn có thể đăng bài này lên Github vì loại câu hỏi này thường được nêu ra và có rất nhiều tùy chọn đa ngôn ngữ ..
Học

1
@Learning Tôi chắc chắn sẽ đưa ra ví dụ đầy đủ trên github.
Mohsen Esmailpour

Điều này sẽ giúp ích rất nhiều cho nhiều lập trình viên như tôi vì Blazor không có nhiều ví dụ trong bối cảnh của tôi ...
Học

1

Điều này đã được hỏi trước đây:

Làm cách nào để thêm nội địa hóa ViewModel vào Blazor?

Tôi đề nghị sử dụng FluentValidation sẽ là cách tiếp cận tốt hơn. Đây là một liên kết đến repo Github của tôi để giải thích cách nó có thể hoạt động:

https://github.com/conficient/BlazorValidationLocalization


Tôi đã có loại giải pháp này trong đầu nhưng đây sẽ là hai tệp phương thức cho mỗi và nếu dự án lớn sẽ trở nên khó quản lý, Có, đây là công việc xoay quanh và khiến mọi thứ hoạt động ...
Học

Không hoàn toàn chắc chắn những gì bạn có nghĩa là "hai tập tin phương thức". Bạn vẫn có thể sử dụng resx với FluentValidation. xem fluentvalidation.net/localization
Quango

-1

Tôi đã không thử điều này!

Trong các tài liệu chính thức của lõi asp.net có phần làm thế nào để bản địa hóa DataAnnotations Có thể bạn tìm thấy một số manh mối ở đó .


Tôi chưa quen với lõi asp.net, tôi đã thử điều khác nhưng không hoạt động trước khi đăng câu hỏi này, tôi đã cố gắng tìm giải pháp cho ví dụ của mình, thử điều khác nhưng có vẻ không hiệu quả với trường hợp của tôi ... hơi khó Tôi đến từ nền tảng biểu mẫu web asp.net không có kinh nghiệm về asp.net MVC ... vì vậy tôi chỉ tập trung vào các trang Dao cạo lõi của asp.net .. hãy xem
Học
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.