如果我用这样的属性装饰我的ViewModels的属性:
public class Vm
{
[Required]
[StringLength(35)]
public string Name {get;set;}
}
Run Code Online (Sandbox Code Playgroud)
我将获得英语验证消息:
"this field is required"
"The field Name must be a string with a maximum length of 35"
Run Code Online (Sandbox Code Playgroud)
我怎么能翻译它们?
我正在使用DataAnnotations属性和ASP.Net MVC 2为我的ViewModel提供模型验证:
public class ExamplePersonViewModel {
[Required(ErrorMessageResourceName = "Required", ErrorMessageResourceType = typeof(Resources.Validation))]
[StringLength(128, ErrorMessageResourceName = "StringLength", ErrorMessageResourceType = typeof(Resources.Validation))]
[DataType(DataType.Text)]
public string Name { get; set; }
[Required(ErrorMessageResourceName = "Required", ErrorMessageResourceType = typeof(Resources.Validation))]
[DataType(DataType.Text)]
public int Age { get; set; }
}
Run Code Online (Sandbox Code Playgroud)
这似乎按预期工作(尽管它非常冗长).我遇到的问题是,正在执行的幕后模型验证与任何特定属性无关.上述模型中的一个例子是该Age属性需要是一个int.如果您尝试在表单上输入非整数值,则会出现以下(非本地化)消息时出错:
字段Age必须是数字.
如何对这些非属性验证消息进行本地化?
是否有可用的这些消息的完整列表,以便我可以确保它们都已本地化?
又一个MVC本地化问题......
我正在尝试使用本地化的资源文件本地化ASP.Net MVC 3应用程序,以按照建议在视图中显示文本.
像往常一样,问题是尝试从数据注释本地化默认错误消息时.
我知道你可以在每个属性中指定资源文件和密钥:
[Required(
ErrorMessageResourceType = typeof(CustomResourceManager),
ErrorMessageResourceName = "ResourceKey")]
public string Username { get; set; }
Run Code Online (Sandbox Code Playgroud)
甚至,这是更好和首选,您可以覆盖默认消息,如下所示:ASP.NET MVC中的数据注释的默认资源,因此您可以保留属性,如:
[Required]
public string Username { get; set; }
Run Code Online (Sandbox Code Playgroud)
最后一种方法是我正在遵循的方法,并且它可以工作,但只有当您要覆盖的DataAnnotation具有ONE和ONLY ONE错误消息时,因为它总是查找与自定义资源文件中的属性相同的资源键(例如"Required"需要资源文件中的"RequiredAttribute"条目)
其他属性(如StringLength)具有多个错误消息,具体取决于您使用的可选参数.所以,如果你有一个像这样的模型:
public class Person
{
[Required]
[StringLengthLocalizedAttribute(10, MinimumLength = 5)]
[Display(Name = "User name")]
public string UserName { get; set; }
}
Run Code Online (Sandbox Code Playgroud)
错误消息是" 字段用户名必须是最小长度为5且最大长度为10的字符串. "
如果您将StringLength属性更改为:
[StringLengthLocalizedAttribute(10)]
Run Code Online (Sandbox Code Playgroud)
错误消息更改为" 字段用户名必须是最大长度为10的字符串. "因此,在这种情况下,至少有2个默认错误消息要覆盖,@ kim-tranjan给出的解决方案失败.
我对此的部分解决方案是实现我自己的StringLength属性,如下所示:
public class StringLengthLocalizedAttribute : …Run Code Online (Sandbox Code Playgroud) 我将资源文件放在单独的程序集MyApp.Resources.dll中.我可以毫无问题地使用资源,但是当我想更改(本地化)默认验证消息时会出现问题:
"{0}字段是必需的." 和"值'{0}'对{1}无效."
该解决方案 DefaultModelBinder.ResourceClassKey = "MyApp.Resources.Global";不起作用,因为它要求ResourceClassKey位于Web项目中的App_GlobalResources文件夹下.
应该为我解决什么?
问候