Как переопределить сообщения об ошибках проверки Entity Framework

У меня есть модель Entity Framework 4.1, которая поддерживает несколько веб-приложений ASP.NET MVC. Я использую DataAnnotations для определения и локализации текста метки, правил проверки и сообщений об ошибках.

Для некоторых приложений мне нужно, чтобы текст метки для определенных полей отличался от стандартного текста, определяемого моделью. Этого легко добиться для самих меток: я получаю нужный мне текст из локального файла ресурсов, связанного с представлением. Однако текст метки также используется в сообщениях об ошибках проверки, таких как «{имя поля} должно иметь максимальную длину 50 символов».

Каков наилучший способ изменить сообщения проверки без изменения аннотаций в классах моделей?


person Paul Taylor    schedule 08.11.2012    source источник


Ответы (2)


Вы связали свою проверку с моделями сущностей. Способ избежать этого — создать модели представления из ваших сущностей и применить к ним проверку.

Пример: если у вас есть Entity...

public class Product
{
    public string Name {get; set;}
}

вы можете создать две разные модели представления:

public class ProductPageViewModel1
{
    [Required]
    public string Name {get; set;}
}

public class ProductPageViewModel2
{
    [DisplayName("Foo")]
    public string Name {get; set;}

}

Сопоставьте объект с моделью представления и используйте их в своих представлениях.

person Dan    schedule 08.11.2012
comment
Это, безусловно, сработает, но это означает написание моделей представлений для каждого представления и сопоставление методов для заполнения моделей представлений из моделей сущностей. С этой точки зрения это кажется дорогим решением. Я надеялся найти более простой подход, возможно, HtmlHelper, который манипулирует метаданными модели для изменения сообщений проверки. - person Paul Taylor; 08.11.2012
comment
Возможно, это дорого в краткосрочной перспективе, но если вы вообще планируете масштабировать свое приложение, я думаю, что это хорошая инвестиция. И в будущем он будет намного читабельнее, чем какой-нибудь волшебный код отражения :). Вы можете использовать что-то вроде Automapper, чтобы упростить сопоставление. Вот хороший пост, объясняющий другие преимущества использования моделей представления: stackoverflow.com/a/4878956 - person Dan; 08.11.2012
comment
Хм. Вы заставили меня задуматься, я вижу преимущества. Проверю Automapper. - person Paul Taylor; 09.11.2012
comment
Automapper впечатляет, требует много работы от этого подхода. Преимущества разделения пользовательского интерфейса и модели предметной области в этом случае неоспоримы, поэтому мы решили пойти по этому пути. - person Paul Taylor; 12.11.2012
comment
Я думаю, что вам не хватает закрывающей скобки ')' в этой строке [DisplayName("Foo"] - person TechplexEngineer; 07.08.2013

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

Модель:

public class Company
    {
        [Required(ErrorMessage = "The field is required")]
        public string CompanyName { get; set; }
        public string Address { get; set; }
    }

контроллер:

 [HttpPost]
        public ActionResult Index(Company company)
        {
            if(ModelState.IsValid)
            {
                //your code
            }

            // your custom validation message here
            if (ModelState["CompanyName"].Errors.Any())
                ModelState["CompanyName"].Errors[0] = new ModelError("custom error message");

            return View();
        }
person testCoder    schedule 09.11.2012
comment
Это тоже полезно, спасибо. Единственный недостаток, который я вижу, заключается в том, что он помещает код проверки в определенные методы контроллера, что затрудняет повторное использование в нескольких связанных представлениях. - person Paul Taylor; 09.11.2012