我正在尝试为我的ASP.NET MVC视图模型编写一个非常简单的数据注释验证器。应用于日期时间字段时,验证程序必须检查日期的年份是否为当前年份。服务器端按预期工作,但客户端似乎没有触发(其他验证器,如范围或必需的工作)
服务器端:
class CurrentYearAttribute : ValidationAttribute, IClientValidatable
{
public override bool IsValid(object value)
{
if(value == null)
{
return false;
}
var date = (DateTime)value;
return (date.Year == DateTime.Now.Year);
}
public override string FormatErrorMessage(string name)
{
return "Le champ " + name + " doit être de l'année en cours.";
}
public IEnumerable<ModelClientValidationRule> GetClientValidationRules(ModelMetadata metadata, ControllerContext context)
{
var rule = new ModelClientValidationRule()
{
ValidationType = "currentyear",
ErrorMessage = FormatErrorMessage(metadata.GetDisplayName()),
};
yield return rule;
}
}
客户端:
<script type="text/javascript">
$(document).ready(function () {
$.validator.addMethod(
'currentyear',
function (value, element, params) {
alert("hello"); // never
return (Date.parse(value).getFullYear() == (new Date()).getFullYear());
});
$.validator.unobtrusive.adapters.addBool("currentyear");
//$.validator.unobtrusive.parse("form");
});
</script>
答案 0 :(得分:2)
我认为您需要在 $.validator.addMethod()
之前致电$.validator.unobtrusive.adapters.addBool
和$(document).ready
。如果您的表单元素是动态插入的,则需要在每个元素上调用$.validator.unobtrusive.parse
或$.validator.unobtrusive.parseElement
。
答案 1 :(得分:1)
问题只是您没有定义适配器的规则部分。
尝试使用以下内容:
$.validator.unobtrusive.adapters.addBool("currentyear", function (options) {
options.rules["currentyear"] = "#" + options.element.name.replace('.', '_'); // mvc html helpers
options.messages["currentyear"] = options.message;
});
关于规则:
此HTML元素的jQuery规则数组。期望适配器将项添加到此规则数组中,以用于要附加的特定jQuery Validate验证器。名称是jQuery Validate规则的名称,值是jQuery Validate规则的参数值。
答案 2 :(得分:1)
您的自定义验证函数和适配器位于jQuery文档就绪函数中,这在此过程中为时已晚。我自己犯了同样的错误。
我修改了你的代码只是为了将设置包装在一个JavaScript闭包中,并将别名的jQuery对象传递给$。
<script type="text/javascript">
(function ($) {
$.validator.addMethod(
'currentyear',
function (value, element, params) {
alert("hello"); // never
return (Date.parse(value).getFullYear() == (new Date()).getFullYear());
});
$.validator.unobtrusive.adapters.addBool("currentyear");
//$.validator.unobtrusive.parse("form");
} (jQuery));
</script>