【问题标题】:MVC 3 validation not working for complex modelMVC 3 验证不适用于复杂模型
【发布时间】:2012-02-09 19:43:03
【问题描述】:

我有一个 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
    }
}

【问题讨论】:

  • 您能发表一下您的看法吗?

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


【解决方案1】:

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

public UserModel User;

你应该有:

public UserModel User { get; set; }

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

【讨论】:

    【解决方案2】:

    我相信验证只涉及模型深处的一个模型属性。例如,如果您有以下型号

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

    【讨论】:

    • 是否有证据支持这一说法?
    • 这篇文章是基于我的经验。我不明白为什么不能将验证添加到嵌入式对象,但我认为必须直接访问该对象的属性。我不认为嵌入对象上的验证注释会被自动检测并应用到视图中。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2016-09-28
    • 1970-01-01
    • 2012-01-24
    • 1970-01-01
    • 2011-12-24
    相关资源
    最近更新 更多