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

Другие вопросы по тегам