如何在MVC5(全球化)上创建动态DataAnnotations属性进行验证?

时间:2014-10-09 14:11:04

标签: c# asp.net .net asp.net-mvc

我正在使用 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;
    }
}

当然,不仅是验证消息,我还需要全球化字段显示名称

1 个答案:

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