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>