我们说我有一个视图模型。它有一个必需的Name
属性。我已经禁用了客户端验证。我在我的动作方法中有这个代码:
if (!ModelState.IsValid)
{
return View(model);
}
所以,一切正常。它会在发布后突出显示所需的字段。但是,我无法理解哪个jQuery validaion函数执行此过程?如何,jQuery Validation检测到表单已提交一次?
我想找到那个代码,因为我想稍微改一下。例如,我有自己的助手,它有自定义验证逻辑。目前,我的自定义助手验证在无效的Post之后没有显示。并且,我想将我的逻辑添加到内置函数中,我无法在任何地方找到它。
答案 0 :(得分:5)
首先,如果您已禁用客户端验证,则jquery验证与它无关(您已禁用它!)。简要说明发布和返回视图时会发生什么。
DefaultModelBinder
初始化模型的新实例DefaultModelBinder
然后读取表单数据(名称/值对)
如果属性名称与其中一个表单数据值匹配,则为
属性已设置(假设其有效),并且还将其值添加到
ModelState
。如果该值无效,则不设置该属性
其值与ModelState
(attemptedValue
)一起添加
ModelState
错误@Html.ValidationMessageFor()
方法
读取ModelState
值以及是否存在关联错误
使用该属性,错误消息将添加到生成的html中
通过ValidationMessageFor()
方法和相关的类名
(其中突出显示)已添加如果您想了解有关这些工作方式的详细信息,可以查看DefaultModelBinder和ValidationExtensions的源代码。
至于"我想找到那个代码,因为我想稍微改变一下" ,然后 DONT 。您没有说明您要执行的操作,或者显示了您的html帮助程序扩展方法的任何代码,但是html帮助程序没有(也不应该)包含验证逻辑。他们负责根据属性和应用于该属性的验证属性生成html。
如果您有属性的自定义验证逻辑,那么您创建一个继承自ValidationAttribute的属性(如果您还需要客户端验证,那么它还需要实现IClientValidatable)。创建自己的验证属性的一个很好的指南是this article。
答案 1 :(得分:2)
Mvc有自己的验证,不是服务器端,可以使用您在模型上设置的数据注释。在帖子上它只是去控制器然后检查模型状态错误,如果它有效它运行你的代码在函数中,如果不是它返回模型及其错误。如果你有jquery验证,它将永远不会去控制器。启用服务器端验证后,在将表单发送到控制器之前完成验证。如果没有jquery,它将在控制器上进行验证。如果不是您要找的东西,请告诉我