【发布时间】:2014-06-19 03:03:24
【问题描述】:
我正在尝试使用 ASP.NET MVC 应用程序中的自定义注释进行客户端验证。抱歉,这篇文章有点冗长。
这是自定义属性:
public class CustomStringLengthAttribute : ValidationAttribute, IClientValidatable
{
public int MaxLength { get; private set; }
public int MinLength { get; set; }
public CustomStringLengthAttribute(int maxLength)
: base(GetDefaultErrorMessage)
{
MaxLength = maxLength;
}
private static string GetDefaultErrorMessage()
{
return "Max length {1}";
}
public override string FormatErrorMessage(string name)
{
return string.Format(ErrorMessageString, name, MaxLength, MinLength);
}
protected override ValidationResult IsValid(object value, ValidationContext validationContext)
{
...
if (length > MaxLength || length < MinLength)
return new ValidationResult(FormatErrorMessage(validationContext.DisplayName));
return ValidationResult.Success;
}
public IEnumerable<ModelClientValidationRule> GetClientValidationRules(ModelMetadata metadata, ControllerContext context)
{
var rule = new ModelClientValidationRule();
rule.ErrorMessage = FormatErrorMessage(metadata.GetDisplayName());
rule.ValidationType = "customstringlength";
rule.ValidationParameters.Add("max", MaxLength);
rule.ValidationParameters.Add("min", MinLength);
yield return rule;
}
}
我在我的视图模型中使用该属性:
[CustomStringLength(25)]
public virtual string BillAddress1 { get; set; }
data- 属性似乎是按应有的方式生成的:
<input data-val="true" data-val-customstringlength="Max length 25" data-val-customstringlength-max="25" data-val-customstringlength-min="0" id="BillAddress1" name="BillAddress1" type="text" value="">
客户端验证启动,但我在 jquery.validate.js 中收到“未捕获的类型错误:无法读取未定义的属性‘调用’”
这是来自 jquery.validate.js 中的“check: function(element) ...” - 方法变量是“undefined”:
查看规则变量可以解释为什么方法变量是未定义的——出于某种原因,包含 min 和 max 参数的数组是“未定义的”而不是命名为“customstringlength”:
但为什么它是“未定义的”??
这是我的 customValidation.js,我在其中添加了适配器等:
(function ($) {
if ($.validator && $.validator.unobtrusive) {
$.validator.unobtrusive.adapters.addMinMax("customstringlength", "min", "max");
$.validator.addMethod("customstringlength", function (value, element, min, max) {
if (value) {
if (value.length < min || value.length > max) {
return false;
}
}
return true;
});
}
}(jQuery));
这里是我调用表单验证的地方:
function validateForm(form) {
prepareValidationScripts(form);
var validator = $.data(form[0], 'validator');
return validator.form();
}
function prepareValidationScripts(form) {
if (form.executed)
return;
form.removeData("validator");
$.validator.unobtrusive.parse(document);
form.executed = true;
}
我已经盯着这个太久了 - 我错过了什么??
【问题讨论】:
-
请不要张贴代码图片或错误消息图片。仅发布实际代码或错误,以便此内容可搜索。
标签: javascript asp.net-mvc jquery-validate unobtrusive-validation