使用数据注释本地化MVC 3 Razor应用程序

时间:2011-11-17 21:05:48

标签: asp.net-mvc-3 validation data-annotations razor

  1. 我希望能够显示正在使用的特定文化的错误消息。

  2. 我有一个使用DataAnnotations的模型,我也有几个资源(resx)文件具有相同的错误消息,但是使用不同的语言。

  3. 我知道我需要以某种方式从数据注释链接到我的资源文件中的消息的Id,但我不确定如何实现它的语法。

  4. 比如说我有以下DataAnnotation文件。我需要将ErrorMessage文本链接到我的资源文件中的特定键。通过实施第3步需要看什么?

    另外,对于像邮政编码或电话号码这样的字段(它是一个不同的正则表达式,我是否必须从模型中取出消息并将其应用于使用该模型的每个视图?

    或者,有没有办法指定我可以在模型中使用哪个正则表达式?

    using System;
    using System.ComponentModel.DataAnnotations;
    using DataAnnotationsExtensions;
    
    namespace YeagerTechModel
    {
        [MetadataType(typeof(Customer_Validation))]
        public partial class Customer
        {
    
        }
    
        public partial class Customer_Validation
        {
            public short CustomerID { get; set; }
    
            [Required]
            [StringLength(50)]
            [DataType(DataType.EmailAddress)]
            [Email]
            public string Email { get; set; }
    
            [StringLength(50, MinimumLength = 3, ErrorMessage = "Must have a minimum length of 3.")]
            [DataType(DataType.Text)]
            public string Company { get; set; }
    
            [StringLength(50, MinimumLength = 3, ErrorMessage = "Must have a minimum length of 3.")]
            [DataType(DataType.Text)]
            public string FirstName { get; set; }
    
            [StringLength(50, MinimumLength = 3, ErrorMessage = "Must have a minimum length of 3.")]
            [DataType(DataType.Text)]
            public string LastName { get; set; }
    
            [StringLength(50, MinimumLength = 3, ErrorMessage = "Must have a minimum length of 3.")]
            [DataType(DataType.Text)]
            public string Address1 { get; set; }
    
            [StringLength(50)]
            [DataType(DataType.Text)]
            public string Address2 { get; set; }
    
            [StringLength(50, MinimumLength = 3, ErrorMessage = "Must have a minimum length of 3.")]
            [DataType(DataType.Text)]
            public string City { get; set; }
    
            [StringLength(2, MinimumLength = 2, ErrorMessage = "Must have a length of 2.")]
            [DataType(DataType.Text)]
            public string State { get; set; }
    
            [StringLength(10)]
            [DataType(DataType.Text)]
            [RegularExpression(@"^\d{5}(-\d{4})?$", ErrorMessage = "Invalid Zip")]
            public string Zip { get; set; }
    
            [StringLength(12)]
            [DataType(DataType.PhoneNumber)]
            [RegularExpression(@"^\s*([\(]?)\[?\s*\d{3}\s*\]?[\)]?\s*[\-]?[\.]?\s*\d{3}\s*[\-]?[\.]?\s*\d{4}$", ErrorMessage = "Invalid Phone")]
            public string HomePhone { get; set; }
    
            [StringLength(12)]
            [DataType(DataType.PhoneNumber)]
            [RegularExpression(@"^\s*([\(]?)\[?\s*\d{3}\s*\]?[\)]?\s*[\-]?[\.]?\s*\d{3}\s*[\-]?[\.]?\s*\d{4}$", ErrorMessage = "Invalid Phone")]
            public string CellPhone { get; set; }
    
            [StringLength(100)]
            [DataType(DataType.Url)]
            [Url]
            public string Website { get; set; }
    
            [StringLength(50)]
            [DataType(DataType.EmailAddress)]
            [Email]
            public string IMAddress { get; set; }
    
            public System.DateTime CreatedDate { get; set; }
    
            public Nullable<System.DateTime> UpdatedDate { get; set; }
        }
    }
    

1 个答案:

答案 0 :(得分:2)

ValidationAttribute上有2个可用于本地化错误消息的属性,它们是ErrorMessageResourceNameErrorMessageResourceType。有关详细信息,请参阅http://msdn.microsoft.com/en-us/library/system.componentmodel.dataannotations.validationattribute.aspx

你会像这样使用它们:

[StringLength(50, MinimumLength = 3, ErrorMessageResourceName= "MinLength3", ErrorMessageResourceType = typeof(MyResource))]
[DataType(DataType.Text)]
public string Company { get; set; }

因此,这将使用文件MyResource.resx和密钥'MinLength3'。同样适用于正则表达式,例如:

[StringLength(12)]
[DataType(DataType.PhoneNumber)]
[RegularExpression(@"^\s*([\(]?)\[?\s*\d{3}\s*\]?[\)]?\s*[\-]?[\.]?\s*\d{3}\s*[\-]?[\.]?\s*\d{4}$", ErrorMessageResourceName= "InvalidPhone", ErrorMessageResourceType = typeof(MyResource))]
public string CellPhone { get; set; }

如果typeof(MyResource)不起作用,那么您可能需要将Resx文件的构建操作更改为“Embedded Resource”,并在编辑resx文件时将“访问修饰符”设置为“public”。