jQuery自定义属性的不显眼的客户端validation

我已经创建了一个自定义validation属性,它在服务器端工作(在表单发布后)但我无法让validation工作在客户端。

自定义属性是:

public class ReasonableAttribute : ValidationAttribute, IClientValidatable { public override bool IsValid(object value) { return Approval.IsNumberReasonable(value.ToString()); } public IEnumerable GetClientValidationRules(ModelMetadata metadata, ControllerContext context) { ModelClientValidationRule rule = new ModelClientValidationRule(); rule.ErrorMessage = FormatErrorMessage(metadata.GetDisplayName()); rule.ValidationType = "reasonable"; yield return rule; } } 

IsNumberReasonable()函数只对字段输入进行一些检查,以确保它们输入的内容可以合理地为批准号(例如,不为空,或“未知”或类似的东西)返回bool true/false

我的模型然后包含:

 [Display(Name = "Approval Number"] [Reasonable(ErrorMessage = "Please enter a reasonable {0}")] public String ApprovalNumber { get; set; } 

并且视图包含:

 @Html.LabelFor(model => model.ApprovalNumber, new { @class = "control-label col-md-3" }) 
@Html.TextBoxFor(model => model.ApprovalNumber, new { @class = "input text" }) @Html.ValidationMessageFor(model => model.ApprovalNumber)

在我尝试添加的JavaScript中:

 $.validator.unobtrusive.adapters.addBool("reasonable", "required"); // OR $.validator.unobtrusive.adapters.add("reasonable"); 

和:(在document.ready之外)

 (function ($) { $.validator.addMethod('reasonable', function (value, element, params) { return value != ''; }, 'Clientside Should Not Postback'); $.validator.unobtrusive.adapters.addBool('reasonable'); })(jQuery); 

各种组合,但无法使其工作。

我有

   

包含在视图中。

提交表单时,客户端validation适用于其他字段(必需的等),但ApprovalNumber旁边的validation消息从未出现/不执行我的自定义validation。

任何指向正确方向的人都会受到赞赏。 谢谢。

我也有

       

已经在Web.config文件中。

编辑2:根据chenZ的post:输入字段的html是:

  

尝试更新我的视图底部:

   (function ($) { $.validator.addMethod('reasonable', function (value, element, params) { return value != ''; }, 'Clientside Should Not Postback'); })(jQuery);    

jquery.validate.unobtrusive.js的结尾现在包含:

  $(function () { $.validator.unobtrusive.adapters.addBool('reasonable'); $("#formID").removeData("unobtrusiveValidation").removeData("validator"); $jQval.unobtrusive.parse(document); }); }(jQuery)); 

create.js包含:

 $.validator.unobtrusive.adapters.addBool("mandatory", "required"); // another custom attribute for checkbox validation var v = $("#formID").validate({ errorClass: "warning", onkeyup: false, onblur: false, }); 

v变量进一步用于提交按钮:

 $("#SubmitButton").click(function () { if (v.form()) { // The form passed validation so continue.. } else { // Validation failed, do something else.. } }); 

我做了一些进一步的测试,似乎与以下内容有关:

 (function ($) { $.validator.addMethod('reasonable', function (value, element, params) { return value != ''; }, 'Clientside Should Not Postback'); })(jQuery); 

当我把它改为:

 (function ($) { $.validator.addMethod('reasonable', function (value, element, params) { return value != 'unknown'; }, 'Clientside Should Not Postback'); })(jQuery); 

它有效,但只有当我在输入框中输入’unknown’时,其他任何东西都会通过..类似的,如果我把return value != 'jhdsfkhsdkfj'; 它只在我输入jhdsfkhsdkfj时validation。

所以它似乎正在使用它作为规则? 而不是我的服务器端IsNumberReasonable()函数。

希望有助于排除故障。

我没有尝试过,所以我不确定,但我认为有两个地方你可能错了。

1.rule.ValidationType =“合理”;
检查你的html,找到输入,是否有attr data-val-reasonalbe或reasonale

 $.each(this.adapters, function () { var prefix = "data-val-" + this.name, 

在jquery.validate.unobtrusive.js,第173行,你可以找到它,所以它必须是data-val-xxxx

2.in jquery.validate.unobtrusive.js你可以找到文件的结尾

 $(function () { $jQval.unobtrusive.parse(document); }); 

所以,当加载页面时,所有表单集都会validation

这是一件困难的事情。 如果你的代码是这样的

   ..... (function ($) { $.validator.addMethod('reasonable', function (value, element, params) { return value != ''; }, 'Clientside Should Not Postback'); $.validator.unobtrusive.adapters.addBool('reasonable'); })(jQuery); 

当你做unobtrusive.parse(文件); 您的有效方法合理不存在,并且适配器也不存在,因此您的表单有效且没有合理的规则

如果您将代码更改为这样

  (function ($) { $.validator.addMethod('reasonable', function (value, element, params) { return value != ''; }, 'Clientside Should Not Postback'); $.validator.unobtrusive.adapters.addBool('reasonable'); })(jQuery);  

有效的方法可以添加,但$ .validator.unobtrusive是未定义的

我认为你应该做得更多

  (function ($) { $.validator.addMethod('reasonable', function (value, element, params) { return value != ''; }, 'Clientside Should Not Postback'); })(jQuery);  

并把

 $.validator.unobtrusive.adapters.addBool('reasonable'); 

进入jquery.validate.unobtrusive.js,并确保它之前运行

 $(function () { $jQval.unobtrusive.parse(document); }); 

我不确定它是否会起作用,也许我会稍后再试。 希望这可以帮到你。

更新我试过了。 在第2点,您可以使用代码

 $(function () { $("#formid").removeData("unobtrusiveValidation").removeData("validator"); $.validator.unobtrusive.parse(document); }); 

在添加有效方法之后放置此代码,这将清除有效设置并使用您的自定义规则再次解析

更新2

 $("#a").validate({});//first time call is useful $("#a").validate({});//second time call is useless 

也是unobtrusive.parse(…)

jquery.validate.js第41行

 var validator = $.data( this[0], "validator" ); if ( validator ) { return validator; } 

和jquery.validate.unobtrusive.js第99行

 result = $form.data(data_validation), ... if (!result) { .... 


这个文件的末尾叫做unobtrusive.parse(document),它会附加一个数据来形成。 如果在设置代码之前调用它,则validation设置不需要您的设置。 你可以删除数据(…),并再次通过你的代码运行unobtrusive.parse(document)

    

validate plugin使用数据名称“validator”和不显眼的使用数据名称“unobtrusiveValidation”。

我真的很抱歉我的英语很差,希望你能理解。

将其添加到Web.config中

       

然后尝试修改您的规则以使用以下规则。

 $.validator.unobtrusive.adapters.add("reasonable", ["reasonable"], function (options) { options.rules["reasonable"] = "#" + options.params.reasonable; options.messages["reasonable"] = options.message;}); 

由于我在查看我的问题时登陆这里,我想分享一下,如果你使用任何第三方库来控制,例如带有选项嵌入客户端库的DevExpress,那么它们实际上可能会重新包含validation脚本,可能会导致您的适配器被正确添加,以后再次丢失。 在我的情况下,我不得不移动我的.js文件,在这些其他违规脚本下面创建客户端不显眼的validation器适配器。 我还想考虑放弃我自己包含的所述文件,或者配置我的第三方库不包括它们,以防止这种混淆。