ASP.NET MVC在客户端运行自定义验证器

时间:2011-11-26 13:57:42

标签: c# asp.net-mvc validation

我尝试使用This Way在客户端触发自定义验证程序,但无法正常运行:

这是我的模型和验证器:

public class ExactStringAttribute : ValidationAttribute {

    public string ValidName { get; set; }

    public override bool IsValid(object value) {

        if (value.ToString() == ValidName)
            return true;
        else
            return false;
    }
}

public class Teacher {

    public long Id { get; set; }
    public string Name { get; set; }
    public string Family { get; set; }
    public int Age { get; set; }
    [Display(Name = "SchoolName CustomValidator(ValidName='MySchool')")]
    [ExactString(ValidName = "MySchool", ErrorMessage = "The Input Name must
       exactly equal by Valid Name")]
    public string SchoolName { get; set; }
}

这是我的剧本:

<script type="text/javascript">
Sys.Mvc.ValidatorRegistry.validators["exactstring"] = function (rule) {
    // initialization code can go here.
    var validname = rule.ValidationParameters["validname"];

    // we return the function that actually does the validation 
    return function (value, context) {
        if (value == validname) {
            return true; /* success */
        }
        return rule.ErrorMessage;
    };
};
</script>

和Global.asax的一部分:

protected void Application_Start() {
        AreaRegistration.RegisterAllAreas();

        RegisterGlobalFilters(GlobalFilters.Filters);
        RegisterRoutes(RouteTable.Routes);
DataAnnotationsModelValidatorProvider.RegisterAdapter(typeof(ExactStringAttribute),
typeof(ExactStringValidator));
    }




    public class ExactStringValidator : 
DataAnnotationsModelValidator<ExactStringAttribute> {

        string validName;
        string errorMessage;

        public ExactStringValidator(ModelMetadata metadata,
 ControllerContext context
          , ExactStringAttribute attribute)
            : base(metadata, context, attribute) {
            validName = attribute.ValidName;

        }

        public override IEnumerable<ModelClientValidationRule>
         GetClientValidationRules() {
            var rule = new ModelClientValidationRule {
                ErrorMessage = errorMessage,

                //Must be lowercase
                ValidationType = "exactstring"

            };

            //Must be lowercase
            rule.ValidationParameters.Add("validname", validName);

            return new[] { rule };
        }
    }

我也在_Layout页面添加脚本:

<script src="@Url.Content("~/Scripts/jquery-1.5.1.min.js")" type="text/javascript">
</script>
<script src="@Url.Content("~/Scripts/MicrosoftAjax.js")" type="text/javascript">    
</script>
<script src="@Url.Content("~/Scripts/MicrosoftMvcAjax.js")" type="text/javascript">
</script>
<script src="@Url.Content("~/Scripts/MicrosoftMvcValidation.js")" 
type="text/javascript"></script>

Controller的一部分:

[HandleError]
public class TeacherController : Controller {
......
}

当我在视图页面中添加Html.EnableClientValidation();表示有关参数的错误但在web.config文件中添加了以下设置时:

<appSettings>
    <add key="webpages:Version" value="1.0.0.0"/>
    <add key="ClientValidationEnabled" value="true"/>
    <add key="UnobtrusiveJavaScriptEnabled" value="true"/>
</appSettings>

但不幸的是,验证者没有在客户端开火,有人知道这个吗?

1 个答案:

答案 0 :(得分:3)

如果你看一下这个答案所用的方法:

MVC custom validation: compare two dates

您将看到应对验证程序组件所做的更改以及必须添加的内容。