如何在blazor服务器端本地化验证消息(DataAnnotationsValidator)


10

我在最新版本的VS 2019中使用blazor 3.1。

到目前为止,我已经可以本地化页面标签(标题,表格字段等)。

ListEmployee.razor页面中,我能够本地化表格标题等。在AddEmplyeeValidation.razor页面中,我能够本地化表单标签,但是在本地化验证消息时遇到问题。

用于验证消息的Employee.cs验证消息是在此文件和Resources/Data文件夹中定义的,其名称定义为Data.Employee.ar.resx并且Data.Employee.ar.resx无法正常工作

使用System.ComponentModel.DataAnnotations;

命名空间BlazorSPA1.Data {公共类Employee {[MaxLength(50)]公共字符串ID { 组; }

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

}

我如何才能基于“添加员工”表单的语言从资源文件中获取验证消息。

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

我读了几篇文章,尝试了几件事,但似乎无济于事

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

我正在使用以下示例进行本地化,但未显示如何本地化错误消息 https://www.c-sharpcorner.com/article/localization-in-blazor-server/

文件夹结构图片

在此处输入图片说明

英文版的资源文件示例以同样的方式我也有阿拉伯文文件

在此处输入图片说明

在下面的屏幕截图中,您将从资源文件中提取字段名称,但对于Validation消息,仅以英文显示,因为它不起作用

在此处输入图片说明

Answers:


7

这是本地化数据注释错误消息的解决方案。我创建了两个资源文件,一个用于字段,另一个用于错误消息。

  • DisplayNameResource 用于本地化字段
  • ErrorMessageResource 用于本地化错误消息

在此处输入图片说明 在此处输入图片说明 在此处输入图片说明 在此处输入图片说明

在视图模型类中,使用Display属性本地化字段名称。要ResourceTypeDisplay属性上指定资源文件使用属性:

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

并在验证属性上使用ErrorMessageResourceNameErrorMessageResourceType指定资源文件:

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

这是完整的示例:

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

错误消息MaxLengthError{0} cannot be longer than {1} character,因此{0}将被替换为本地化的文件名,{1}并将被替换为256您在属性上指定的[StringLength(256,...


1
我会尝试了这一点,似乎它应该工作..我将不胜感激,如果你能发布此Github上为这种或问题往往会提高,也有多种语言选择大量..
学习

1
@Learning我肯定会将完整的示例放在github上。
Mohsen Esmailpour

这将对像我这样的许多程序员有很大帮助,因为Blazor在我的上下文中没有太多示例...
学习

1

之前有人问过:

如何将ViewModel本地化添加到Blazor?

我建议使用FluentValidation将是更好的方法。这是我的Github仓库的链接,展示了它如何工作:

https://github.com/conficient/BlazorValidationLocalization


我想到了这种解决方案,但是每个解决方案都会有两个模式文件,如果项目很大,将变得很难管理。是的,这是一个变通方法,可以使工作正常……
学习

不太清楚“两个模式文件”的含义。您仍然可以将resx与FluentValidation一起使用。参见fluentvalidation.net/localization
Quango

-1

我没有尝试过!

在asp.net core的官方文档中,有一节介绍如何本地化。DataAnnotations 也许您在那里找到了一些线索


我是asp.net核心的新手,我尝试了不同的方法,但在发布此问题之前并没有解决问题,我尝试自己查看示例,尝试尝试不同的方法,但似乎不适用于我的情况……这有点困难我来自asp.net网络表单背景,没有使用过asp.net MVC的经验...所以我的重点是只关注asp.net核心Razor页面..让我们看看
学习
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.