Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/jquery/71.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 实现IClientValidable的问题-GetClientValidationRules从不触发_C#_Jquery_Validation_Asp.net Mvc 4 - Fatal编程技术网

C# 实现IClientValidable的问题-GetClientValidationRules从不触发

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 {

我正在为我的MVC4应用程序构建一个自定义验证器。为了简单起见,并关注这个问题的目的,让我们假设我正在重新实现
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"/>