如何在MVC5上创建用于验证的动态DataAnnotations属性(全球化)

本文关键字:DataAnnotations 动态 属性 全球化 验证 MVC5 用于 创建 | 更新日期: 2023-09-27 18:26:01

我将ef6mvc5一起使用。我的项目需要多种语言。因此,我需要创建一个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;
    }
}

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

如何在MVC5上创建用于验证的动态DataAnnotations属性(全球化)

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