如何在MVC5上创建用于验证的动态DataAnnotations属性(全球化)
本文关键字:DataAnnotations 动态 属性 全球化 验证 MVC5 用于 创建 | 更新日期: 2023-09-27 18:26:01
我将ef6与mvc5一起使用。我的项目需要多种语言。因此,我需要创建一个DataAnnotations属性来验证这些字段。
例如:我有一个Id属性:
public int Id { get; set; }
为了验证,我需要添加像这样的注释
[Display("User Id")]
Required(ErrorMessage = "Please input the Id")
public int Id { get; set; }
但我需要使用多种语言,所以我创建了一个新的DataAnnotations属性(https://stackoverflow.com/a/2432520/1900498):
public class LocalizedDisplayAttribute : DisplayNameAttribute
{
public LocalizedDisplayAttribute(string resourceId)
: base(GetMessageFromResource(resourceId))
{ }
private static string GetMessageFromResource(string resourceId)
{
// TODO: Return the string from the resource file
}
}
它工作得很好,但它会缓存结果,然后当会话更改时(我使用会话保存用户网站页面的语言模式。比如1表示英语,0表示其他语言),它仍然没有更改,这对我来说是个问题。
第二个问题是:我不知道如何重写RequiredAttribute以让用户知道,有些字段不能为空。
但我也发现了另一个问题,看起来我需要重写关于数字字段的消息。。。。。。(xx字段必须是数字)
那么,有什么方法可以重写验证规则吗?让我决定Required、Range、Numeric…的错误消息。。。。。。它会缓存它,但当会话更改时,它会再次读取吗?
例如:
// if session changed rewrite rule message for current language
if (session["language"].ToString() != LastLanguage)
{
if (session["language"].ToString() == "1")
//English
{
RequiredMessage = "the field {0} must be required";
NumericMessage = "the field {0} must be a number";
LastLanguage = 1;
} else{
// other language
RequiredMessage = "xx xx {0} xxxxxxxxx";
NumericMessage = "xx xx {0} xxxxxxxxxx";
LastLanguage = 0;
}
}
当然,不仅仅是验证消息,我还需要全球化字段显示名称。
DataAnnotation
已经提供全球化支持:
[Display(ResourceType = typeof(Resource), Name = "Test")]
[Required(ErrorMessageResourceType = typeof(Resource), ErrorMessageResourceName = "TestRequired")]
public string Test { get; set; }
更改global.asax
中的当前区域性
private void Application_AcquireRequestState(object sender, EventArgs e)
{
if (Context != null && Context.Session != null)
{
string language = Context.Session["language"] as string;
if (language != null)
{
Thread.CurrentThread.CurrentCulture = new CultureInfo(language);
Thread.CurrentThread.CurrentUICulture = new CultureInfo(language);
}
}
}