继本文之后,对定制属性执行客户端验证
我正在尝试将方法传递给客户端脚本,以了解如何执行此操作
据我了解,到目前为止,要使用MVC 3实现自定义验证,需要执行以下操作
创建一个自定义验证属性
基于ValidationAttribute并实现IClientValidatable。我还看到了一些来自ModelValidator的示例,该示例似乎实现了ValidationAttribute和IClientValidatable的功能。所以这是我的第一点困惑,是关于差异是什么,还是在MVC 2中使用了ModelValidator,但现在不赞成使用它还是什么?
必须从GetClientValidationRules()返回ModelClientValidationRule的实例,以指定详细信息,例如错误消息,ValidationType(我理解为将执行客户端验证的Javascript函数的名称)以及该属性的任何其他自定义参数可能有,并且需要传递给Javascript验证。
我假设运行时(不确定它的哪一部分)然后使用ModelClientValidationRule来在标记元素中生成html属性,如下所示:
data-val="true" (to indicate that the element requires validation)
data-val-[ValidationType]=[ErrorMessage]
data-val-[ValidationType].[ValidationParameters(n).Key]=[ValidationParameters(n).Value]
实现客户端验证逻辑
必须创建一个Javascript函数,并使用jQuery.validators.addmethod()将其添加到jQuery.validators中,以便JQuery在需要执行时就知道它。就像是:
jQuery.validator.addMethod(
'greaterThan',
function (value, element, params) {
/.../
return /* true or false */ ;
},
''
);
我的问题是,签名“函数(值,元素,参数)”是否为处理验证方法的标准,我认为某些jQuery功能会在适当的时间(例如,在提交表单之前或提交表单时)调用该函数。元素松动或在keyUp事件上。我只是不了解如何控制此事件,即选择哪个事件适合您的自定义验证。
实施不干扰的适配器
这会将不干扰的属性转换为;我不太清楚这件事,但是假设它是jQuery规则,但是我不清楚它们是如何工作的。就像是
jQuery.validator.unobtrusive.adapters.add(
'futuredate',
{ },
function (options) {
options.rules['greaterThan'] = true;
options.messages['greaterThan'] = options.message;
}
);
我的问题是关于“功能(选项)”。这是将在“功能(值,元素,参数)”之前调用的功能,该功能负责将不引人注目的标签提取到jQuery.Validation可以理解的数据结构中。从代码示例中,在我看来,options是一个对象,其中包含标签的属性值(例如options.message)和它必须映射到的jQuery相关属性(例如options.messages ['ClientSideValidationFunctionName']如果是这样,如何检索和映射自定义参数。
我希望我不会再增加任何混乱。
凤凰求蛊