使用DataAnnotations进行验证多种语言

时间:2011-04-18 20:19:00

标签: asp.net-mvc-2 data-modeling multilingual

我正在使用模型验证编写对象。 我的应用程序应该使用3种语言(英语,德语和捷克语)

我应该如何为验证模型获取适当的语言字符串?

捷克选项:

[DisplayName("Nazev")]
[StringLength(200,ErrorMessage="Nazev musi byt 10 az 200 znaku dlouhy",MinimumLength=10)]
[Column]
public string Name { get; set; }

英文选项:

[DisplayName("Name")]
[StringLength(200,ErrorMessage="Name has to be between 10 and 200",MinimumLength=10)]
[Column]
public string Name { get; set; }

2 个答案:

答案 0 :(得分:3)

您必须使用LocalilizedDisplayName属性,请参阅此问题:DisplayName attribute from Resources?

[Required(ErrorMessageResourceType = typeof(Resources), ErrorMessageResourceName = "LastNameMandatory")]
[LocalizedDisplayName("LastName")]
public string RenterLastName { get; set; }

答案 1 :(得分:0)

如果您的解决方案允许您使用资源字符串,则LocalizedDisplayName可以正常工作。不幸的是,在我的项目中,我们有几种语言并且还在不断增长......翻译都保存在数据库中。

因此我们采用了

的方法
  1. 继承自我们自己的dll中的属性,
  2. 然后获取默认格式字符串并将其用作我们消息的基本值
  3. 让我们的翻译工厂获取值或在数据库中注册默认值
  4. 然后我们导入命名空间并给它一个别名,实现的版本看起来像这样:

    using tf = MyDating.Translation;
    
    我们在ViewViewModel中执行

    [tf.DisplayName("Verify Password")]
    [DataType(DataType.Password)]
    [tf.Compare("Password")]
    public string VerifyPassword
    {
        get;
        set;
    }
    

    上面的CompareAttribute看起来像这样:

    public class CompareAttribute : System.ComponentModel.DataAnnotations.CompareAttribute
    {
        public CompareAttribute(string otherProperty)
            :base(otherProperty)
        {
            var tf = TranslatetionFactory.Current.GetSection("CompareAttribute");
            var msg = tf.Get(this.ErrorMessageString);
            ErrorMessage = msg;
        }
    }