jQuery对自定义属性进行不引人注目的客户端验证
我已经创建了一个自定义验证属性,该属性在服务器端工作(在表单发布后),但无法使验证在客户端工作 自定义属性为:jQuery对自定义属性进行不引人注目的客户端验证,jquery,asp.net-mvc,validation,asp.net-mvc-4,unobtrusive-validation,Jquery,Asp.net Mvc,Validation,Asp.net Mvc 4,Unobtrusive Validation,我已经创建了一个自定义验证属性,该属性在服务器端工作(在表单发布后),但无法使验证在客户端工作 自定义属性为: public class ReasonableAttribute : ValidationAttribute, IClientValidatable { public override bool IsValid(object value) { return Approval.IsNumberReasonable(value.ToString());
public class ReasonableAttribute : ValidationAttribute, IClientValidatable
{
public override bool IsValid(object value)
{
return Approval.IsNumberReasonable(value.ToString());
}
public IEnumerable<ModelClientValidationRule> GetClientValidationRules(ModelMetadata metadata, ControllerContext context)
{
ModelClientValidationRule rule = new ModelClientValidationRule();
rule.ErrorMessage = FormatErrorMessage(metadata.GetDisplayName());
rule.ValidationType = "reasonable";
yield return rule;
}
}
该视图包含:
[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" })
<div class="col-md-9 append field">
@Html.TextBoxFor(model => model.ApprovalNumber, new { @class = "input text" })
@Html.ValidationMessageFor(model => model.ApprovalNumber)
</div>
$(function () {
$.validator.unobtrusive.adapters.addBool('reasonable');
$("#formID").removeData("unobtrusiveValidation").removeData("validator");
$jQval.unobtrusive.parse(document);
});
}(jQuery));
$.validator.unobtrusive.adapters.addBool("mandatory", "required"); // another custom attribute for checkbox validation
var v = $("#formID").validate({
errorClass: "warning",
onkeyup: false,
onblur: false,
});
和:(文件外。准备就绪)
在各种组合中,但都无法使其工作
我有
<script src="~/Scripts/jquery.validate.js"></script>
<script src="~/Scripts/jquery.validate.unobtrusive.js"></script>
和create.js
包含:
[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" })
<div class="col-md-9 append field">
@Html.TextBoxFor(model => model.ApprovalNumber, new { @class = "input text" })
@Html.ValidationMessageFor(model => model.ApprovalNumber)
</div>
$(function () {
$.validator.unobtrusive.adapters.addBool('reasonable');
$("#formID").removeData("unobtrusiveValidation").removeData("validator");
$jQval.unobtrusive.parse(document);
});
}(jQuery));
$.validator.unobtrusive.adapters.addBool("mandatory", "required"); // another custom attribute for checkbox validation
var v = $("#formID").validate({
errorClass: "warning",
onkeyup: false,
onblur: false,
});
v
变量被进一步用于submit按钮:
$("#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);
它可以工作,但只有当我在输入框中键入“未知”时,其他内容才会通过。。同样,如果我输入返回值!='jhdsfkhsdkfj'代码>它仅在输入jhdsfkhsdkfj时验证
那么它似乎是以此为准则的?而不是我的服务器端IsNumberReasonable()
函数
希望这有助于排除故障。将其添加到Web.config中
<configuration>
<appSettings>
<add key="ClientValidationEnabled" value="true" />
<add key="UnobtrusiveJavaScriptEnabled" value="true" />
</appSettings>
</configuration>
我没有试过,所以我不确定,但我认为有两个地方你可能错了
1.rule.ValidationType=“合理”
检查您的html,找到输入,是否有attr data val reasonalbe或reasonale
$.each(this.adapters, function () {
var prefix = "data-val-" + this.name,
在jquery.validate.unobtrusive.js的第173行,您可以找到它,因此它必须是一个数据val xxxx
2.在jquery.validate.unobtrusive.js文件末尾可以找到
$(function () {
$jQval.unobtrusive.parse(document);
});
因此,在加载页面时,所有表单集都会进行验证
这是一件困难的事情。
如果您的代码是
<script src="~/Scripts/jquery.validate.js"></script>
<script src="~/Scripts/jquery.validate.unobtrusive.js"></script>
.....
(function ($) {
$.validator.addMethod('reasonable', function (value, element, params) {
return value != '';
}, 'Clientside Should Not Postback');
$.validator.unobtrusive.adapters.addBool('reasonable');
})(jQuery);
输入jquery.validate.unobtrusive.js,并确保它在之前运行
$(function () {
$jQval.unobtrusive.parse(document);
});
我不确定它是否有效,也许我会稍后再试。
希望这能帮助你
更新
我试过了。
在第2点中,您可以使用代码
$(function () {
$("#formid").removeData("unobtrusiveValidation").removeData("validator");
$.validator.unobtrusive.parse(document);
});
将此代码放在AddValid方法之后,这将清除有效设置并使用自定义规则再次解析
更新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)的文件的末尾,它将向表单追加一个数据。
如果在设置代码之前调用,则验证设置不包含您的设置。
您可以删除数据(…),并再次通过代码运行unobtrusive.parse(document),如
<script src="~/Scripts/jquery.validate.unobtrusive.js"></script>
<script src="~/Scripts/setting.js"></script>
<script>
$(function(){ $("#formid").removeData(...).removeData(...);
....unobtrusive.parse(document)});
</script>
$(function(){$(“#formid”).removeData(…).removeData(…);
..不引人注目。解析(文档)};
验证插件使用数据名“validator”和不引人注目的使用数据名“unobtrusiveValidation”
我真的很抱歉我的英语不好,希望你能理解。因为我在这里查看我的问题,我想与大家分享,如果你使用任何第三方库进行控制,例如带有选项嵌入客户端库的DevExpress,那么它们实际上可能会重新包含验证脚本,这可能会导致您的适配器被正确添加,但随后又会丢失。在我的例子中,我必须将我的.js文件移动到这些其他有问题的脚本下面,以创建客户端不引人注目的验证器适配器。我还想考虑删除我自己包含的文件,或者配置我的第三方库不包括它们,以防止这种混淆。嗨,Gjohn,你在Web.CONFIG中已经提出了什么建议。我忘了把它添加到原始帖子中了…上面的$.validator.addMethod是参考jq.validate.untrusive吗?不是100%确定你的意思。。是吗$.validator.addMethod
和$.validator.messages
在JS中的其他地方使用过,所以我假设这就是它的语法。您好,chenZ,是的,输入确实有一个数据值合理
属性。我尝试了你的建议(用更多信息更新了原始帖子),但仍然不能100%起作用。谢谢。第一次运行unobtrusive.parse(document)或运行$(..).validate({}),它会将数据设置为表单,下次运行时,它会检查表单是否有数据,什么也不做。
$(function () {
$("#formid").removeData("unobtrusiveValidation").removeData("validator");
$.validator.unobtrusive.parse(document);
});
$("#a").validate({});//first time call is useful
$("#a").validate({});//second time call is useless
var validator = $.data( this[0], "validator" );
if ( validator ) {
return validator;
}
result = $form.data(data_validation),
...
if (!result) { ....
<script src="~/Scripts/jquery.validate.unobtrusive.js"></script>
<script src="~/Scripts/setting.js"></script>
<script>
$(function(){ $("#formid").removeData(...).removeData(...);
....unobtrusive.parse(document)});
</script>