代码的哪一部分显示了asp.net MVC中Post后的验证错误

本文关键字:Post 验证 错误 MVC asp 一部分 显示 代码 net | 更新日期: 2023-09-27 18:03:59

假设我有一个视图模型。它有一个必需的Name性质。我还禁用了客户端验证。在我的action方法中有这段代码:

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

所以,一切都很好。它将在post后突出显示所需的字段。但是,我不明白是哪个jQuery验证函数完成了这个过程?如何,jQuery验证检测表单已提交一次?

我想找到这段代码,因为我想稍微修改一下。例如,我有自己的助手,它具有自定义验证逻辑。目前,我的自定义助手验证在无效Post后没有显示。而且,我想把我的逻辑添加到内置函数,我找不到任何地方。

代码的哪一部分显示了asp.net MVC中Post后的验证错误

首先,如果您禁用了客户端验证,jquery验证与它无关(您已经禁用了它!)。简单解释一下当你发布和返回视图时会发生什么。

  1. DefaultModelBinder初始化您的模型的新实例
  2. DefaultModelBinder然后读取表单数据(名称/值对)如果属性名与表单数据值之一匹配,则其属性设置(假设其有效),并将其值添加到ModelState。如果该值无效,则不会设置该属性,而是它的值被添加到ModelState (attemptedValue)a ModelState错误
  3. 当你返回视图,你的@Html.ValidationMessageFor()方法读取ModelState值,如果有相关的错误使用该属性,错误消息被添加到生成的HTML中通过ValidationMessageFor()方法和相关的类名(突出显示)添加

如果你想了解更多关于DefaultModelBinder和ValidationExtensions工作原理的细节,你可以查看它们的源代码。

至于"我想找到那段代码,因为我想稍微改变它",那么不要。您没有指出要做什么,也没有显示html helper扩展方法的任何代码,但是html helper不(也不应该)包含验证逻辑。它们负责基于属性和应用于该属性的验证属性生成html。

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

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