【问题标题】:Model Binding and Validation Errors模型绑定和验证错误
【发布时间】:2013-08-02 20:52:35
【问题描述】:

我正在使用 asp.net MVC3,我对这项技术非常陌生。

我的模型的设计方式是,如果数据无效,属性将引发验证错误。在这种情况下,属性未设置无效数据。

当我重新显示我的编辑视图时,会显示验证错误消息;但是用户之前输入的值已经消失了,因为它绑定的模型只包含旧的有效数据。

例如,假设我有一个 Person 类,而 Name 属性不能是 null 或空字符串,否则它会引发验证异常并阻止设置该属性。现在假设用户从Name 属性中删除了值,并尝试从网络上保存Person。将抛出验证异常并正确处理以将错误添加到ModelState,以便将其显示在屏幕上;但是,Name 的旧值会重新显示,因为无效的空字符串从未进入属性。

我不知道如何解决这个问题,任何关于这个问题的建议将不胜感激。

【问题讨论】:

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


    【解决方案1】:

    我的建议是允许无效数据但使用验证属性。您不会保存无效实体,因此没有问题,这是当今的标准方法。如果您不想这样做,则没有简单的解决方案。最简单的解决方案是使用 Request.Form 中的信息

    【讨论】:

    • 我与我的团队进行了多次详细的对话。我同意你关于允许无效数据进入模型的观点,但他们不允许。如果我们实现了您建议的设计,那么使用这些模型在其他应用程序中实现验证会更容易。虽然这种设计确保我们的模型对象在大多数情况下都是有效的,但它会导致问题,因为 UI 和它所绑定的底层模型不同步。因此,我们有 2 个级别的验证:执行 UI 验证和模型验证。所以,我将不得不找到那个“不容易”的解决方案。
    【解决方案2】:

    这个问题的解决方案是创建一个 ViewModel 允许在其中输入无效数据。该解决方案还简化了我的 ModelBinder 类,因为它承担了大部分工作。

    【讨论】:

      【解决方案3】:

      您应该实现IValidatableObject 以在服务器端执行这种验证。

      来自 MSDN IValidatableObject Interface:

      提供一种使对象失效的方法。

      这里有一个例子Using IValidatableObject Custom Validation,同样来自 MSDN。

      【讨论】:

      • 所以,我的模型有一个 Validate 方法,并且我已经显示了服务器端检测到的验证错误;但是,正在显示旧值。我在我的问题中添加了一个示例,以进一步阐明我的问题是什么......我不确定 IValidatableObject 接口将如何帮助我解决我的问题????
      • “我的模型的设计方式是,如果数据无效,属性将引发验证错误。在这种情况下,属性未设置无效数据。”。这就是问题所在,如果新值无效,模型将永远不会设置新值,那么只会显示旧值!这就是为什么你应该使用接口实现验证
      • 我必须在这里遗漏一些关键。正如您所说, IValidatableObject “提供了一种使对象无效的方法”。并有1个方法“验证”。我通读了您发布的示例(演示了如何进行自定义验证);但是,我仍然看不到旧数据在使用时是如何显示的?很抱歉,您能再解释一下吗?
      • 要显示旧数据,如果 Model.IsValid 返回 false,您应该将对象传递回视图。谷歌关于使用 ASP.NET mvc 的简单 CRUD!
      • 我不想显示旧数据。我想重新显示用户提供的信息。如果 Person.Name 属性最初包含“Frinny”。然后用户从绑定到 Name 属性的文本框中删除所有内容并点击保存按钮。在绑定期间调用 Person.Name 属性的设置逻辑时将引发验证异常......因此该属性将永远不会被设置。现在,当我返回带有 Person 的视图时,旧名称会重新出现,并在旁边显示一条验证消息,说明“您必须提供一个名称”,这没有意义,因为旧名称在那里
      猜你喜欢
      • 1970-01-01
      • 2018-02-07
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2012-09-14
      • 2014-08-08
      相关资源
      最近更新 更多