MVC 3验证不适用于复杂模型

时间:2012-02-09 19:43:04

标签: asp.net-mvc asp.net-mvc-3 asp.net-mvc-validation

我有一个UserFormModel,它包含一个UserModel,它具有一组具有[Required]属性集的属性。我已经读过,开箱即用的MVC 3将默认验证模型中的模型。但是,当我在视图中提交一个空表单时,传回一个包含空UserModel的UserFormModel,ModelState.IsValid始终为true。

我已经尝试将UserModel发送回我的控制器并验证确定。它似乎就在我使用复杂模型时它没有验证。

我还尝试使用UserFormModel中User属性的[Required]属性(我认为默认行为不需要它),但仍然没有进行验证。

对此问题的任何想法都将不胜感激。

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 个答案:

答案 0 :(得分:3)

您应该使用属性而非字段。所以而不是:

public UserModel User;

你应该:

public UserModel User { get; set; }

原因是默认模型绑定器仅适用于属性。

答案 1 :(得分: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类,则验证将对数据库起作用。根据我的经验,对视图模型的验证只会起作用。