【发布时间】:2014-03-27 00:55:48
【问题描述】:
我创建了一个在服务器端工作的自定义验证属性(在表单发布后),但我无法让验证在客户端工作。
自定义属性为:
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;
}
}
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" })
<div class="col-md-9 append field">
@Html.TextBoxFor(model => model.ApprovalNumber, new { @class = "input text" })
@Html.ValidationMessageFor(model => model.ApprovalNumber)
</div>
在我尝试添加的 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);
在各种组合中,但未能使其发挥作用。
我有
<script src="~/Scripts/jquery.validate.js"></script>
<script src="~/Scripts/jquery.validate.unobtrusive.js"></script>
包含在视图中。
提交表单后,客户端验证适用于其他字段(必填字段等),但 ApprovalNumber 旁边的验证消息永远不会出现/不执行我的自定义验证。
感谢任何指向正确方向的指针。 谢谢。
我也有
<configuration>
<appSettings>
<add key="ClientValidationEnabled" value="true" />
<add key="UnobtrusiveJavaScriptEnabled" value="true" />
</appSettings>
</configuration>
已经在 Web.config 文件中。
编辑 2: 根据 chenZ 的帖子: 输入字段的html是:
<input class="input text valid" data-val="true" data-val-reasonable="Please enter a reasonable Approval Number" data-val-required="Approval Number is Required." id="ApprovalNumber" name="ApprovalNumber" type="text" value="">
尝试更新我的视图底部:
<script src="~/Scripts/jquery.validate.js"></script>
<script type="text/javascript">
(function ($) {
$.validator.addMethod('reasonable', function (value, element, params) {
return value != '';
}, 'Clientside Should Not Postback');
})(jQuery);
</script>
<script src="~/Scripts/jquery.validate.unobtrusive.js"></script>
<script src="~/Scripts/Create.js"></script>
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);
它有效,但只有当我在输入框中键入“未知”时,其他任何东西都会通过.. 同样,如果我输入 return value != 'jhdsfkhsdkfj';,它只会在我输入 jhdsfkhsdkfj 时验证。
所以看起来它正在使用它作为规则?而不是我的服务器端 IsNumberReasonable() 函数。
希望对故障排除有所帮助。
【问题讨论】:
-
是 $.validator.addMethod 上面的 ref jq.validate.unobtrusive 吗?
-
不是 100% 确定您的意思。是吗?
$.validator.addMethod和$.validator.messages在 JS 的其他地方使用过,所以我认为这就是它的语法..
标签: jquery asp.net-mvc validation asp.net-mvc-4 unobtrusive-validation