Asp.net mvc MVC 3验证不适用于复杂模型

Asp.net mvc MVC 3验证不适用于复杂模型,asp.net-mvc,asp.net-mvc-3,asp.net-mvc-validation,Asp.net Mvc,Asp.net Mvc 3,Asp.net Mvc Validation,我有一个UserFormModel,其中包含一个UserModel,该UserModel具有一组具有[Required]属性集的属性。我已经读到MVC 3开箱即用将在默认情况下验证模型中的模型。但是,当我在视图中提交一个空表单并传回包含空UserModel的UserFormModel时,ModelState.IsValid始终为true 我已经尝试将UserModel发送回我的控制器,这验证了ok。当我处理复杂的模型时,它似乎无法验证 我还尝试过在UserFormModel中的User属性上使用

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

我已经尝试将UserModel发送回我的控制器,这验证了ok。当我处理复杂的模型时,它似乎无法验证

我还尝试过在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
    }
}
公共类UserFormModel
{
公共用户模型用户;
公共IEnumerable角色{get;set;}
}
公共类UserModel:ModelBase
{       
[必需]
公共字符串用户名{get;set;}
公共字符串标题{get;set;}
[必需]
公共字符串名{get;set;}
[必需]
公共字符串LastName{get;set;}
}
[HttpPost]
公共操作结果创建(UserFormModel UserFormModel)
{
if(ModelState.IsValid)
{
//做点什么
}
}

您应该使用属性而不是字段。因此,不是:

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对象的验证将有效,针对product类的验证不会有任何警告。如果产品类是实体框架代码优先方法中使用的POCO类,则验证将针对数据库进行。根据我的经验,针对视图模型的验证只会起到一个深层次的作用。

你能发布你的视图是什么样子的吗?有什么证据支持这一说法吗?这篇文章基于我的经验。我不明白为什么不能将验证添加到嵌入式对象中,但我认为必须直接访问该对象的属性。我认为嵌入对象上的验证注释不会被自动检测并应用到视图中。