带参数的ASP.NET MVC 3客户端验证

继本文之后,对定制属性执行客户端验证


我正在尝试将方法传递给客户端脚本,以了解如何执行此操作


据我了解,到目前为止,要使用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']如果是这样,如何检索和映射自定义参数。


我希望我不会再增加任何混乱。


哈士奇WWW
浏览 375回答 3
3回答

凤凰求蛊

ModelValidator方法来自MVC2,在我看来,今后不应在MVC3项目上使用该方法。MVC3 ValidationAttribute / IClientValidatable方法更加简洁,并且不涉及修改global.asax来注册适配器。
打开App,查看更多内容
随时随地看视频慕课网APP