悠悠楠杉
ASP.NETCore模型验证消息的本地化实践指南
一、设置本地化支持
在 ASP.NET Core 中启用本地化,首先需要在 Startup.cs
的 ConfigureServices
方法中添加本地化服务和请求本地化选项:
csharp
public void ConfigureServices(IServiceCollection services)
{
services.AddLocalization(options => {
options.ResourcesPath = "Resources"; // 指定资源文件存放的路径
});
services.AddControllersWithViews().AddDataAnnotationsLocalization(options => {
options.ClientSideValidationLanguage = "en-US"; // 默认客户端验证语言为英语(美国)
});
}
二、创建资源文件
接下来,为每种语言创建资源文件。例如,对于英文和中文,你可以在 Resources
文件夹下创建两个名为 ModelValidation
的资源文件:ModelValidation.en.resx
和 ModelValidation.zh-Hans.resx
。在资源文件中,你可以为每个属性定义不同的验证消息:
- ModelValidation.en.resx: 英文资源文件,定义英文的验证消息。
- ModelValidation.zh-Hans.resx: 中文资源文件,定义中文的验证消息。
三、使用资源文件进行模型验证
在数据模型中,使用 [Display(Name = "Name", ResourceType = typeof(ModelValidation))]
和 [Required(ErrorMessageResourceType = typeof(ModelValidation), ErrorMessageResourceName = "NameRequired")]
等特性将数据注解与资源文件关联起来。例如:
csharp
public class UserModel : IValidatableObject
{
[Required(ErrorMessageResourceType = typeof(ModelValidation), ErrorMessageResourceName = "NameRequired")]
[Display(Name = "Name", ResourceType = typeof(ModelValidation))]
public string Name { get; set; }
// 其他属性...
public IEnumerable<ValidationResult> Validate(ValidationContext validationContext) => new List<ValidationResult>(); // 实现 IValidatableObject 接口的 Validate 方法(如果需要)
}
四、自定义验证消息和规则
如果默认的验证规则不满足需求,可以自定义验证属性并使用 ErrorMessageResourceType
和 ErrorMessageResourceName
属性与资源文件关联:
csharp
public class UserModel : IValidatableObject // 如果需要自定义验证规则,实现 IValidatableObject 接口并重写 Validate 方法。这里只是简单示例。 实际使用中应按需编写逻辑。
{ // ... 其他属性... // 使用自定义验证规则示例 [Custom(ErrorType.Warning, ErrorMessageResourceType = typeof(ModelValidation), ErrorMessageResourceName = "CustomWarningMessage")] public int Age { get; set; } // 自定义验证逻辑应在这里实现 } // 在 ModelValidation.zh-Hans.resx 和 ModelValidation.en.resx 中定义 CustomWarningMessage 资源项。 具体值在具体上下文中定义。 // 例如: en: "Age is out of range." // zh-Hans: "年龄超出范围。" // 注意: 在此示例中 CustomAttributeAdapter 应被用于 DataAnnotationsModelValidatorFactoryOptions 中注册以支持自定义验证规则。 } // ... }
实际使用中,别忘了在 Startup.cs
的 ConfigureServices
方法中为自定义验证注册一个自定义的 DataAnnotationsModelValidatorFactoryOptions
。例如: services.AddControllersWithViews(options => { options.ModelValidatorFactoryOptions = new ModelValidatorFactoryOptions { CustomValidatorFactories = new List