【问题标题】:Localizing an MVC 3 Razor app with Data Annotations使用数据注释本地化 MVC 3 Razor 应用程序
【发布时间】:2023-03-09 03:04:01
【问题描述】:
  1. 我希望能够针对正在使用的特定文化显示错误消息。

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

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

例如,我有以下 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; }
    }
}

【问题讨论】:

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


    【解决方案1】:

    ValidationAttribute 上有 2 个属性可用于本地化错误消息,它们是 ErrorMessageResourceName 和 ErrorMessageResourceType。请参阅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 文件时将 Resx 文件的构建操作更改为“嵌入式资源”并将“访问修饰符”设置为“公共”。

    【讨论】:

    • 如果您要走本地化路线,您还可以将 DisplayAttribute 与资源一起使用 - 它公开了 ResourceType 字段和 Name/Description/ShortName/Prompt 等字段,因此您可以本地化标签和工具提示显示在 UI 中,网页本身没有额外的代码。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-08-07
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多