Локализация приложения MVC 3 Razor с аннотациями данных - PullRequest
1 голос
/ 18 ноября 2011
  1. Я хочу отображать сообщения об ошибках для конкретной используемой культуры.

  2. У меня есть Модель, которая использует DataAnnotations, и у меня также есть несколько файлов ресурсов (resx) с тем же сообщением об ошибке, но на другом языке.

  3. Я знаю, что мне нужно каким-то образом связать аннотацию данных с идентификатором сообщения в моем файле ресурсов, но я не уверен в синтаксисе, как этого добиться.

Скажем, например, у меня есть файл 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 Ответ

2 голосов
/ 08 декабря 2011

Есть 2 свойства на ValidationAttribute, которые можно использовать для локализации сообщений об ошибках, это 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 на «Embedded Resource» и установить «модификатор доступа».в 'public' при редактировании файла resx.

...