【问题标题】:Which part of the code shows validation errors after Post in asp.net MVC?在 asp.net MVC 中发布后代码的哪一部分显示验证错误?
【发布时间】:2015-07-22 17:26:55
【问题描述】:

假设我有一个视图模型。它有一个必需的Name 属性。而且我禁用了客户端验证。我的操作方法中有这段代码:

     if (!ModelState.IsValid)
        {
            return View(model);
        }

所以,一切正常。它将在发布后突出显示必填字段。但是,我不明白哪个 jQuery 验证函数执行此过程? jQuery Validation 如何检测到表单已经提交过一次?

我想找到那个代码,因为我想稍微改变一下。例如,我有自己的助手,它具有自定义验证逻辑。目前,我的自定义助手验证在无效帖子后未显示。而且,我想将我的逻辑添加到我无法在任何地方找到的内置函数中。

【问题讨论】:

  • “我已经禁用了客户端验证。” ~ 不知道你在问什么... jQuery 验证 IS “客户端”验证......你说它已被“禁用”。也许这就是为什么你在任何地方都找不到它的原因。
  • @sparky 禁用客户端验证,并不意味着提交后不会显示验证消息。我想了解什么是函数,它向元素添加无效样式并显示验证消息。我什至不知道这个过程是发生在服务器端还是客户端。你能解释一下吗?
  • Mvc 使用您在模型上设置的数据注释进行自己的验证。在发布后,它只是转到控制器然后检查模型状态错误,如果它有效,它会在函数中运行你的代码,如果不是,它会返回带有错误的模型。如果你有 jquery 验证,它一开始就永远不会去控制器。
  • jQuery Validation 是 JavaScript,它只在客户端运行。如果您禁用了客户端验证,那么 jQuery Validate 与此无关。

标签: c# asp.net-mvc validation asp.net-mvc-4


【解决方案1】:

首先,如果您禁用了客户端验证,则 jquery 验证与它无关(您已禁用它!)。简要说明当您发布和返回视图时会发生什么。

  1. DefaultModelBinder 初始化模型的新实例
  2. DefaultModelBinder 然后读取表单数据(名称/值对) 如果属性名称与表单数据值之一匹配,则其 属性被设置(假设其有效)并且它的值也被添加到 ModelState。如果该值无效,则该属性未设置,但 它的值被添加到ModelStateattemptedValue)以及 ModelState 错误
  3. 返回视图时,@Html.ValidationMessageFor() 方法 读取ModelState 值以及是否存在相关错误 使用属性,错误信息被添加到生成的html中 通过ValidationMessageFor() 方法和相关的类名 (突出显示)已添加

如果您想详细了解它们的工作原理,可以查看DefaultModelBinderValidationExtensions 的源代码。

至于“我想找到那个代码,因为我想稍微改变一下”,然后不要。您还没有说明您要做什么,也没有显示您的 html 帮助程序扩展方法的任何代码,但 html 帮助程序不(也不应该)包含验证逻辑。他们负责根据属性和应用于该属性的验证属性生成 html。

如果您有一个属性的自定义验证逻辑,那么您创建一个继承自 ValidationAttribute 的属性(如果您还想要客户端验证,那么它还需要实现 IClientValidatable)。 this article 是创建您自己的验证属性的一个很好的指南。

【讨论】:

  • 感谢您的详细解答。但是,我会选择其他答案,因为他的答案是第一个且正确的。
  • 您的问题是“我想找到那个代码” 接受的答案在哪里?而“回答正确”? - "Mvc 有自己的验证,不是服务器端是错误的" - 它是服务器端验证和 "当启用服务器端验证时,验证完成在表格之前”也是错误的
  • @İhsanİlicali,您应该接受 最佳 答案,而不是第一个答案。显然,这是最好的,因为它直接回答您的具体问题并且不包含错误信息。
【解决方案2】:

Mvc 有自己的验证,它不是服务器端的,并且可以与您在模型上设置的数据注释一起使用。在发布后,它只是转到控制器然后检查模型状态错误,如果它有效,它会在函数中运行你的代码,如果不是,它会返回带有错误的模型。如果你有 jquery 验证,它一开始就永远不会去控制器。启用服务器端验证后,将在表单发送到控制器之前完成验证。如果没有 jquery,它将在控制器上进行验证。如果不是你要找的,请告诉我

【讨论】:

  • “启用服务器端验证时,验证在表单发送到控制器之前完成。” ~ 我想你的意思是说 “当 CLIENT 端验证已启用..."
猜你喜欢
  • 1970-01-01
  • 2015-04-09
  • 1970-01-01
  • 1970-01-01
  • 2010-11-14
  • 2010-12-25
  • 1970-01-01
  • 2019-02-20
  • 1970-01-01
相关资源
最近更新 更多