我正在使用 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字段必须是数字)
那么有没有办法可以重写验证规则,让我决定必需,范围,数字......的错误信息......它会缓存它但是当会话改变时,它会再次读取吗?
例如:
// 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;
}
}
当然,不仅是验证消息,我还需要全球化字段显示名称。
答案 0 :(得分: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);
}
}
}