2012-02-09 5 views
1

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

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

Я также попробовал его с атрибутом [Обязательный] в свойстве 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 
    } 
} 
+0

Можете ли вы опубликовать, как выглядит ваше мнение? – nemesv

ответ

3

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

public UserModel User; 

вы должны иметь:

public UserModel User { get; set; } 

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

+0

Спасибо, что разобрался с проблемой. Школьная ошибка! – Cragly

0

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

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, используемым в первом методе кода инфраструктуры сущности, проверка будет работать против базы данных. Валидация против модели просмотра будет работать только в глубине моего опыта.

+0

Есть ли доказательства, подтверждающие это утверждение? –

+0

Это сообщение основано на моем опыте. Я не понимаю, почему валидация не может быть добавлена ​​во встроенный объект, но я думаю, что к свойствам этого объекта нужно будет обращаться напрямую. Я не думаю, что аннотации проверки на встроенный объект будут автоматически обнаружены и применены в представлении. –