Сообщения об ошибках для проверки модели с использованием аннотаций данных - PullRequest
21 голосов
/ 11 мая 2010

Даны следующие классы:

using System.ComponentModel.DataAnnotations;

public class Book{
   public Contact PrimaryContact{get; set;}
   public Contact SecondaryContact{get; set;}

   [Required(ErrorMessage="Book name is required")]
   public string Name{get; set;}
}
public class Contact{
    [Required(ErrorMessage="Name is required")]
    public string Name{get; set;}
}

Есть ли чистый способ дать отдельное сообщение об ошибке для каждого экземпляра Contact в Book с использованием DataAnnotations? Например, если имя отсутствует в экземпляре PrimaryContact, ошибка будет означать «требуется имя основного контакта».

Мое текущее решение состоит в том, чтобы создать службу проверки, которая проверяет состояние модели на наличие ошибок на местах, затем удаляет указанные ошибки и добавляет их обратно, используя нужный мне язык.

Ответы [ 3 ]

38 голосов
/ 12 мая 2010

Это единственный способ узнать об этом, но он далеко не чистый. Он включает использование подклассов и классов MetaData для «переопределения» сообщения об ошибке.

public class Book
{
    public PrimaryContact PrimaryContact { get; set; }
    public SecondaryContact SecondaryContact { get; set; }

    [Required(ErrorMessage = "Book name is required")]
    public string Name { get; set; }
}

public class Contact
{
    [Required(ErrorMessage = "Name is required")]
    public string Name { get; set; }
}

[MetadataType(typeof(PrimaryContactMD))]
public class PrimaryContact : Contact
{
    class PrimaryContactMD
    {
        [Required(ErrorMessage = "Primary Contact Name is required")]
        public string Name { get; set; }
    }
}

[MetadataType(typeof(SecondaryContactMD))]
public class SecondaryContact : Contact
{
    class SecondaryContactMD
    {
        [Required(ErrorMessage = "Secondary Contact Name is required")]
        public string Name { get; set; }
    }
}
10 голосов
/ 11 июля 2015

Я понимаю, что это старо, но в интересах помочь другим, кто столкнулся с этой проблемой и наткнулся на этот вопрос, как я, вы можете захотеть использовать атрибут CustomValidation для таких свойств вместо того, чтобы полагаться на Required атрибут.

CustomValidation позволит вам более детально адаптировать ваши сообщения проверки к недвижимости, которую вы проверяете. Я использовал context.DisplayName, чтобы динамически отображать имя проверяемого свойства просто для краткости, но это может быть дополнительно настроено в зависимости от ваших потребностей.

Если требуется дополнительная настройка, вы можете написать разные обработчики CustomValidation для каждого отдельного свойства, вместо того, чтобы просто использовать один и тот же, как я делал в моем примере кода.

using System.ComponentModel.DataAnnotations;

public class Book {
    [CustomValidation(typeof(Book), "ValidateContact")]
    public Contact PrimaryContact { get; set; }

    [CustomValidation(typeof(Book), "ValidateContact")]
    public Contact SecondaryContact { get; set; }

    [Required(ErrorMessage = "Book name is required")]
    public string Name { get; set; }

    public static ValidationResult ValidateContact(Contact contact, ValidationContext context) {
        ValidationResult result = null;

        if (contact == null) {
            result = new ValidationResult(string.Format("{0} is required.", context.DisplayName));
        } else if (string.IsNullOrWhiteSpace(contact.Name)) {
            result = new ValidationResult(string.Format("{0} name is required.", context.DisplayName));
        }

        return result;
    }
}

public class Contact {
    [Required(ErrorMessage = "Name is required")]
    public string Name { get; set; }
}
0 голосов
/ 12 ноября 2012

Я тоже ищу ответ на этот вопрос, что я нашел до сих пор, если вы сделаете что-то вроде: «{0} Имя контакта требуется» в сообщении об ошибке оно автоматически заменит имя переменной. Я полагаю, что есть способ явно использовать эту функцию.

...