【问题标题】:ASP.NET MVC - ModelState.IsValid is false, how to bypass?ASP.NET MVC - ModelState.IsValid 为假,如何绕过?
【发布时间】:2010-03-07 19:20:51
【问题描述】:

我有一个创建客户的小应用程序

[Authorize]
[AcceptVerbs(HttpVerbs.Post)]
public ActionResult CreateCustomer(GWCustomer customer)
{
    if (string.IsNullOrEmpty(customer.CustomerName))
    {
        ModelState.AddModelError("CustomerName", "The name cannot be empty");
    }
    //...
    if (ModelState.IsValid)
    {
        //insert in db
    }
}

我的问题是GWCustomer 对象有一个Id,它是主键,不能为空。这使得验证框架将其标记为错误。但这不是错误,我还没有创建客户,现在应该是 null 直到它被保存。我该如何绕过这个?或者修复它?

我永远无法将其插入数据库,因为 ModelState 永远无效。

编辑我正在使用 Linq to SQL 和存储库模式。

【问题讨论】:

  • 您尚未向我们提供有关您实际验证方式的任何信息。你可能想要包括这个。什么验证框架?验证属性/方法是什么样的?
  • 使用 EntityFramework,您可以向模型或 DAO 请求一个新的默认对象,然后填写数据。在 Metske 设计模式中,它被称为“Builder”,而您正在尝试的是“Prototype”。 MVC 可能更喜欢这种方法。
  • 您的编辑仍然没有解释任何关于“验证框架”的内容。 Linq to SQL 和存储库模式不是验证框架。 Linq to SQL 是一个对象关系映射器,而存储库模式是一个 CRUD 抽象。这些都不与 ModelState 交互。 ID验证错误实际上来自哪里?什么类/组件?实际验证 ID 的代码行在哪里?
  • 验证“框架”是我在代码中向您展示的。我没有做更多的验证。 ID 的错误(据我所知)是由 Linq2Sql dataContext 生成的,因为我的 ID 在 DB 中列为“非空” - 它是一个身份。
  • Linq to SQL 不与 ModelState 交互。实际上必须验证 ID 并调用 AddModelError。您没有向我们展示执行此操作的部分。看起来您甚至没有使用 any 验证框架,而是在控制器中手动进行。那么检查ID 属性的代码行在哪里呢?还是您实际上在某个地方遇到了异常?

标签: asp.net-mvc validation


【解决方案1】:

这将从绑定中排除值,但不排除验证:

public ActionResult CreateCustomer([Bind(Exclude = "Id")]GWCustomer customer)

即使发生验证,您仍然可以通过调用更正 ModelState:

ModelState.Remove("Id");

如果只有 Id 导致错误,它将删除与 Id 相关的条目并将 ModelState.Valid 属性更改为 true。

不建议在视图层中使用数据层对象。您绝对应该考虑创建没有Id 字段的专用视图模型。

【讨论】:

  • 这就是你要找的。​​span>
  • ModelState.Remove 正是我需要将我从覆盖属性中拯救出来的。谢谢!
  • 你是救生员。谢谢!
  • 如果有人最终在这里寻找完全关闭属性验证的方法,请查看 [ValidateNever] 属性 (see the docs)。
【解决方案2】:

也许你的观点中有这行:

@Html.HiddenFor(model => model.Id)

删除它,视图将不会将该参数与模型一起发送。

【讨论】:

  • 但是 EF 不是将 Id0 作为新实体的创建吗?
【解决方案3】:

这就是为什么我总是说 ViewModel 对象(输入和输出)应该与域对象分开。

输入模型应该按照你上面的方式进行验证;在将域对象状态写入数据库之前,应验证域对象状态(如果它因某种原因无效则抛出异常)。

【讨论】:

  • 我有一个存储库模式,我的 CRUD 在一个单独的类中,用于执行您描述的操作。我正在尝试验证我的域对象,但似乎验证框架让我感到困惑。我想我做了域对象和输入/输出的分离 - “按书”
  • @pdr 我完全同意这个答案。始终绑定到视图模型而不是您的域对象。这是单独的逻辑。接受的答案可能会解决问题,但这绝对不是最佳实践。
猜你喜欢
  • 1970-01-01
  • 2012-07-20
  • 1970-01-01
  • 2018-02-16
  • 2011-02-22
  • 2011-06-13
  • 1970-01-01
  • 1970-01-01
  • 2020-08-23
相关资源
最近更新 更多