Проверка MVC 3 не работает для сложной модели - PullRequest
1 голос
/ 09 февраля 2012

У меня есть 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
    }
}

Ответы [ 2 ]

3 голосов
/ 10 февраля 2012

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

public UserModel User;

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

public UserModel User { get; set; }

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

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

...