Проверка MVC 3 не работает для сложной модели
У меня есть UserFormModel, который содержит UserModel, который имеет набор свойств с установленным атрибутом [Обязательный]. Я прочитал, что 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
}
}
2 ответа
Вы должны использовать свойства, а не поля. Так что вместо:
public UserModel User;
у тебя должно быть:
public UserModel User { get; set; }
Причина этого заключается в том, что связыватель модели по умолчанию работает только со свойствами.
Я считаю, что валидация затрагивает только одно свойство модели. Например, если у вас есть следующая модель
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, используемым в первом методе кода структуры сущности, проверка будет работать с базой данных. Валидация на основе модели представлений будет работать только в моем опыте.