Поддержка вложенной модели и проверки класса с помощью ASP.NET MVC 2.0.

Я пытаюсь проверить модель, содержащую другие объекты, с помощью правил проверки с использованием атрибутов System.ComponentModel.DataAnnotations, надеясь, что реализации MVC по умолчанию будет достаточно:

var obj = js.Deserialize(json, objectInfo.ObjectType);
if(!TryValidateModel(obj))
{
    // Handle failed model validation.
}

Объект состоит из примитивных типов, но также содержит другие классы, которые также используют DataAnnotication. Вот так:

public class Entry
{
    [Required]
    public Person Subscriber { get; set; }

    [Required]
    public String Company { get; set; }
}

public class Person
{
    public String FirstName { get; set;}

    [Required]
    public String Surname { get; set; }
}

Проблема в том, что проверка ASP.NET MVC опускается только на 1 уровень и оценивает только свойства класса верхнего уровня, что можно прочитать на digitallycreated.net/Blog/54/deep-inside-asp.net-mvc-2 -модель-метаданные-и-проверка.

Кто-нибудь знает элегантное решение для этого? Я пробовал xVal, но они, похоже, используют нерекурсивный шаблон (http://blog.stevensanderson.com/2009/01/10/xval-a-validation-framework-for-aspnet-mvc/).

Кто-то должен был столкнуться с этой проблемой раньше, верно? Вложение объектов в вашу модель не кажется таким уж странным, если вы разрабатываете веб-сервис.


person Diep-Vriezer    schedule 09.06.2010    source источник
comment
ModelState.IsValid по какой-то причине проверяет также вложенные объекты, в отличие от TryValidateModel. Сбивает с толку.   -  person JustAMartin    schedule 16.10.2012


Ответы (1)


Я предлагаю изучить Fluent Validation из codeplex. Правила проверки содержатся в отдельном классе (аналогично тому, как работают NHibernate и Fluent NHibernate). Один использует лямбда, чтобы указать свойство для проверки, поддерживая дочерние свойства.

`

public class MaintainCompanyViewModelValidator : AbstractValidator<MaintainCompanyViewModel>
    {
        public MaintainCompanyViewModelValidator()
        {
            RuleFor(model => model.Company.ShortName)
                .NotEmpty();
        }

`

person Rich    schedule 16.06.2010