在asp.net MVC中Post后,哪部分代码显示验证错误?

时间:2015-07-22 17:26:55

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

我们说我有一个视图模型。它有一个必需的Name属性。我已经禁用了客户端验证。我在我的动作方法中有这个代码:

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

所以,一切正常。它会在发布后突出显示所需的字段。但是,我无法理解哪个jQuery validaion函数执行此过程?如何,jQuery Validation检测到表单已提交一次?

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

2 个答案:

答案 0 :(得分:5)

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

  1. DefaultModelBinder初始化模型的新实例
  2. DefaultModelBinder然后读取表单数据(名称/值对) 如果属性名称与其中一个表单数据值匹配,则为 属性已设置(假设其有效),并且还将其值添加到 ModelState。如果该值无效,则不设置该属性 其值与ModelStateattemptedValue)一起添加 ModelState错误
  3. 当您返回视图时,使用@Html.ValidationMessageFor()方法 读取ModelState值以及是否存在关联错误 使用该属性,错误消息将添加到生成的html中 通过ValidationMessageFor()方法和相关的类名 (其中突出显示)已添加
  4. 如果您想了解有关这些工作方式的详细信息,可以查看DefaultModelBinderValidationExtensions的源代码。

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

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

答案 1 :(得分:2)

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