gpt4 book ai didi

javascript - 客户端自定义注释验证不起作用

转载 作者:行者123 更新时间:2023-12-03 12:24:13 26 4
gpt4 key购买 nike

我正在尝试在 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;
}
}

我在 View 模型中使用该属性:

[CustomStringLength(25)]
public virtual string BillAddress1 { get; set; }

数据属性似乎是按其应有的方式生成的:

<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 中收到“Uncaught TypeError: Cannot read property 'call' of undefined”

这来自 jquery.validate.js 中的“check: function(element) ...” - 方法变量是“未定义”:

jquery.validate.js, check: function(element) ...

查看规则变量可以解释为什么方法变量未定义 - 由于某种原因,包含 min 和 max 参数的数组是“未定义”而不是被命名为“customstringlength”:

jquery.validate.js, check: function(element) ...

但为什么它是“未定义”??

这是我的 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;
}

我已经盯着这个太久了 - 我错过了什么?

最佳答案

我终于成功了!我决定不尝试使用“方便”的 addMinMax 适配器,而是编写一个自定义适配器。这是更新后的 customValidation.js(其他所有内容保持不变):

(function ($) {
if ($.validator && $.validator.unobtrusive) {

$.validator.unobtrusive.adapters.add('customstringlength', ['min', 'max'], function(options) {
options.rules['customstringlength'] = {
min: options.params.min,
max: options.params.max,
};
options.messages['customstringlength'] = options.message;
});

$.validator.addMethod('customstringlength', function (value, element, params) {
if (value) {
if (value.length < params.min || value.length > params.max) {
return false;
}
}
return true;
});
}
}(jQuery));

关于javascript - 客户端自定义注释验证不起作用,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/24298112/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com