Проверка MVC 3 не работает для сложной модели

У меня есть UserFormModel, который содержит UserModel, который имеет набор свойств с установленным атрибутом [Required]. Я читал, что MVC 3 из коробки будет проверять модели в моделях по умолчанию. Однако, когда я отправляю пустую форму в своем представлении, возвращая UserFormModel, содержащую пустую UserModel, ModelState.IsValid всегда имеет значение true.

Я попытался отправить только UserModel обратно на свой контроллер, и это подтверждается. Просто кажется, что когда я работаю со сложными моделями, они не проверяются.

Я также пробовал это с атрибутом [Required] в свойстве User в UserFormModel (который, я считаю, не требуется для работы поведения по умолчанию), но проверка по-прежнему не выполняется.

Любые идеи по этому поводу будут высоко оценены.

public class UserFormModel
{
    public UserModel User;

    public IEnumerable<SelectListItem> Roles { get; set; }
}

public class UserModel : ModelBase
{       
    [Required]
    public string UserName { get; set; }

    public string Title { get; set; }

    [Required]
    public string FirstName { get; set; }

    [Required]
    public string LastName { get; set; }
}

[HttpPost]
public ActionResult Create(UserFormModel userFormModel)
{
    if (ModelState.IsValid)
    {
        // Do Something
    }
}

person Cragly    schedule 09.02.2012    source источник
comment
Можете ли вы опубликовать, как выглядит ваш вид?   -  person nemesv    schedule 10.02.2012


Ответы (2)


Вы должны использовать свойства, а не поля. Итак, вместо:

public UserModel User;

у вас должно быть:

public UserModel User { get; set; }

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

person Darin Dimitrov    schedule 10.02.2012

Я считаю, что проверка проходит только одно свойство модели вглубь модели. Например, если у вас есть следующая модель

public class Product
{
    public int ProductId { get; set; }
    [Required]
    public int ProductName { get; set; }
    [Required]
    public decimal Price { get; set; }
}

public class ProductViewModel
{
    [Required]
    public Product Product { get; set; }
}

Проверка по объекту продукта в модели представления будет работать, проверка по классу продукта не будет с одной оговоркой. Если класс Product является классом POCO, используемым в первом методе кода платформы сущностей, проверка будет работать с базой данных. По моему опыту, проверка по модели представления будет работать только в глубине.

person wayne.blackmon    schedule 10.02.2012
comment
Есть ли доказательства, подтверждающие это утверждение? - person Paul Fleming; 20.09.2012
comment
Этот пост основан на моем опыте. Я не понимаю, почему нельзя добавить проверку к встроенному объекту, но я думаю, что к свойствам этого объекта нужно будет обращаться напрямую. Я не думаю, что аннотации проверки встроенного объекта будут автоматически обнаружены и применены в представлении. - person wayne.blackmon; 20.09.2012