C# 实现IClientValidable的问题-GetClientValidationRules从不触发
我正在为我的MVC4应用程序构建一个自定义验证器。为了简单起见,并关注这个问题的目的,让我们假设我正在重新实现C# 实现IClientValidable的问题-GetClientValidationRules从不触发,c#,jquery,validation,asp.net-mvc-4,C#,Jquery,Validation,Asp.net Mvc 4,我正在为我的MVC4应用程序构建一个自定义验证器。为了简单起见,并关注这个问题的目的,让我们假设我正在重新实现RequiredAttribute类的服务器端和客户端验证: [AttributeUsage(AttributeTargets.Property, AllowMultiple = false, Inherited = false)] public class MyRequiredAttribute: ValidationAttribute, IClientValidatable {
RequiredAttribute
类的服务器端和客户端验证:
[AttributeUsage(AttributeTargets.Property, AllowMultiple = false, Inherited = false)]
public class MyRequiredAttribute: ValidationAttribute, IClientValidatable
{
public MyRequiredAttribute() : base("The {0} field is required.")
{
}
protected override ValidationResult IsValid(object value, ValidationContext validationContext)
{
if (value == null)
{
return new ValidationResult(FormatErrorMessage(validationContext.DisplayName));
}
return null;
}
public IEnumerable<ModelClientValidationRule> GetClientValidationRules(ModelMetadata metadata, ControllerContext context)
{
yield return new ModelClientValidationRequiredRule(ErrorMessage = FormatErrorMessage(metadata.GetDisplayName()));
}
}
还有一个非常简单的模型:
public class MyThing
{
[MyRequired]
public string Value { get; set; }
[Required]
public string OtherValue { get; set; }
}
最后是索引视图:
@model MyThing
@{
Layout = "~/Views/Shared/_LayoutWithAllTheAppropriateValidationScripts.cshtml";
}
<!DOCTYPE html>
<html>
<head>
<meta name="viewport" content="width=device-width" />
<title>Index</title>
</head>
<body>
<div>
@using(Html.BeginForm()){
@Html.ValidationSummary(true)
@Html.EditorForModel()
<input type="submit" value="submit"/>
}
</div>
</body>
</html>
@模型神话
@{
Layout=“~/Views/Shared/\u Layout和所有适当的ValidationScript.cshtml”;
}
指数
@使用(Html.BeginForm()){
@Html.ValidationSummary(true)
@Html.EditorForModel()
}
您会注意到,我有值
,它用自定义的MyRequiredAttribute
修饰,还有其他值
,它用标准的RequiredAttribute
修饰
这两种方法在服务器端都能很好地工作,并在回发时返回相应的验证消息,但只有标准的RequiredAttribute
在客户端工作。由于我使用的是ModelClientValidationRequiredRule
而不是带有自定义ValidationType
属性的ModelClientValidationRule
,所以我假设不需要定义自定义客户端验证规则,但我不确定这一点,因为我还没能做到这一点。调试器从不中断GetClientValidationRules
方法的内部,并且为我的模型上的Value
属性生成的输入html元素与OtherValue
字段一样,不具有所需的data val
和data val
属性,我假设这是GetClientValidationRules
方法负责的
我一定错过了一些简单的东西。。。是什么?将此添加到您的Global.asax:
DataAnnotationsModelValidatorProvider.RegisterAdapter(typeof(MyRequiredAttribute), typeof(RequiredAttributeAdapter));
这应该可以解决您的客户端验证问题。这原来是用户错误,但我还是会发布解决方案,希望它能帮助其他人解决类似问题 原始问题中的代码位于使用它的MVC项目的单独程序集中。MVC项目最近已从MVC3升级为MVC4。我有过,至少我是这么想的。我在web.config中漏掉了一块:
<runtime>
<assemblyBinding xmlns="urn:schemas-microsoft-com:asm.v1">
<dependentAssembly>
<assemblyIdentity name="System.Web.Mvc" publicKeyToken="31bf3856ad364e35"/>
<bindingRedirect oldVersion="1.0.0.0-2.0.0.0" newVersion="3.0.0.0"/>
</dependentAssembly>
</assemblyBinding>
</runtime>
应该是什么
<bindingRedirect oldVersion="1.0.0.0-4.0.0.0" newVersion="4.0.0.0"/>
这解决了问题。这实际上是结合了两种不同的方法来创建自定义验证属性,如概述和所示。我在提供的代码中使用了IClientValidable方法。仅仅添加您提供的代码行是不够的。
<bindingRedirect oldVersion="1.0.0.0-2.0.0.0" newVersion="3.0.0.0"/>
<bindingRedirect oldVersion="1.0.0.0-4.0.0.0" newVersion="4.0.0.0"/>