Asp.net mvc ASP.NET MVC自定义验证程序未触发
我正在尝试为我的ASP.NET MVC viewmodel编写一个非常简单的数据注释验证程序。当应用于datetime字段时,验证程序必须检查日期的年份是否为当前年份。服务器端按预期工作,但客户端似乎不会触发(其他验证器,如范围或所需工作) 服务器端:Asp.net mvc ASP.NET MVC自定义验证程序未触发,asp.net-mvc,unobtrusive-validation,Asp.net Mvc,Unobtrusive Validation,我正在尝试为我的ASP.NET MVC viewmodel编写一个非常简单的数据注释验证程序。当应用于datetime字段时,验证程序必须检查日期的年份是否为当前年份。服务器端按预期工作,但客户端似乎不会触发(其他验证器,如范围或所需工作) 服务器端: class CurrentYearAttribute : ValidationAttribute, IClientValidatable { public override bool IsValid(object value) {
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>
class CurrentYearAttribute:ValidationAttribute,IClientValidable
{
公共覆盖布尔值有效(对象值)
{
如果(值==null)
{
返回false;
}
变量日期=(日期时间)值;
return(date.Year==DateTime.Now.Year);
}
公共重写字符串FormatErrorMessage(字符串名称)
{
返回“lechamp”+name+“doitêtre de l'année en cours.”;
}
公共IEnumerable GetClientValidationRules(ModelMetadata元数据、ControllerContext上下文)
{
var rule=new ModelClientValidationRule()
{
ValidationType=“当前年份”,
ErrorMessage=FormatErrorMessage(metadata.GetDisplayName()),
};
收益率-收益率规则;
}
}
客户端:
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>
$(文档).ready(函数(){
$.validator.addMethod(
“本年度”,
函数(值、元素、参数){
警惕(“你好”);//从不
return(Date.parse(value).getFullYear()==(newdate()).getFullYear());
});
$.validator.unobtrusive.adapters.addBool(“当前年度”);
//$.validator.unobtrusive.parse(“表单”);
});
我认为您需要在$(文档)之前调用$.validator.addMethod()
和$.validator.unobtrusive.adapters.addBool
。如果表单元素是动态插入的,您需要在每个元素上调用$.validator.unobtrusive.parse
或$.validator.unobtrusive.parseElement
。我认为您需要在之前调用$.validator.addMethod()
和$.validator.unobtrusive.adapters.addBool
$(document).ready
。如果动态插入表单元素,则需要在每个元素上调用$.validator.unobtrusive.parse
或$.validator.unobtrusive.parseElement
。问题在于您没有定义适配器的规则部分
尝试使用类似以下内容:
$.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验证验证程序的规则数组。名称是jQuery验证规则的名称,值是jQuery验证规则的参数值。问题在于您尚未定义适配器的规则部分
尝试使用类似以下内容:
$.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 Validator的此规则数组。名称是jQuery Validate规则的名称,值是jQuery Validate规则的参数值。您的自定义验证函数和适配器位于jQuery document ready函数中,该过程太晚了。我将此设置为我错了
我修改了您的代码,只是为了将设置包装在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>
(函数($){
$.validator.addMethod(
“本年度”,
函数(值、元素、参数){
警惕(“你好”);//从不
return(Date.parse(value).getFullYear()==(newdate()).getFullYear());
});
$.validator.unobtrusive.adapters.addBool(“当前年度”);
//$.validator.unobtrusive.parse(“表单”);
}(jQuery));
您的自定义验证函数和适配器位于jQuery document ready函数中,这在过程中太晚了。我自己也犯了同样的错误
我修改了您的代码,只是为了将设置包装在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>
(函数($){
$.validator.addMethod(
“本年度”,
函数(值、元素、参数){
警惕(“你好”);//从不
return(Date.parse(value).getFullYear()==(newdate()).getFullYear());
});
$.validator.unobtrusive.adapters.addBool(“当前年度”);
//$.validator.unobtrusive.parse(“表单”);
}(jQuery));