本文介绍了ASP.NET MVC3:ValidationType ModelClientValidationRule的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!

问题描述

我刚刚创建了一个示例应用程序MVC3学验证。它使用DataAnnotations。我已经创建了一个名为CustomStartLetterMatch一个自定义ValidationAttribute 。这是落实System.Web.Mvc.IClientValidatable。我有相应的客户端code用不显眼的jQuery写的。这是工作正常。

关于自定义验证:它的第一个名字输入姓氏输入进行比较。它会引发错误,如果他们两个人的第一个字符是不一样的。

正如我所说的,应用程序工作正常。但是,当我看着 rule.ValidationType =greaterdate; 我糊涂了。我想将其更改为其他像anotherDefaultType的东西。当我改变它,它失败使用jQuery错误。


  1. 是什么原因呢?

  2. 什么是可用的ValidationTypes?

  3. 什么是建议的方法来改变ValidationType在这个scenari

code:

 使用系统;
使用System.ComponentModel.DataAnnotations;
使用System.Collections.Generic;
命名空间MyValidationTEST
{
    公共类Person
    {
    [(所需的名字的ErrorMessage =)必填]
    公共字符串名字{获得;组; }    [CustomStartLetterMatch(名字)]
    [StringLength(5,的ErrorMessage =必须在5个字符)]
    公共字符串名字{获得;组; }    [范围(18,50,的ErrorMessage =必须在18和50之间)]
    公众诠释年龄{搞定;组; }}公共密封类CustomStartLetterMatch:ValidationAttribute,System.Web.Mvc.IClientValidatable
{    私人常量字符串_defaultErrorMessage =的第一个字母{0}必须是同为{1}第一letetr
    私人字符串_basePropertyName;    公共CustomStartLetterMatch(字符串basePropertyName)
        :基地(_defaultErrorMessage)
    {
        _basePropertyName = basePropertyName;
    }
    //覆盖FormatErrorMessage方法
    公众覆盖字符串FormatErrorMessage(字符串名称)
    {
        返回的String.Format(_defaultErrorMessage,姓名,_basePropertyName);
    }
    //覆盖的IsValid
    保护覆盖的ValidationResult的IsValid(对象的值,System.ComponentModel.DataAnnotations.ValidationContext validationContext)
    {
        //获取PropertyInfo对象
        VAR basePropertyInfo = validationContext.ObjectType.GetProperty(_basePropertyName);
        VAR baseValue =(字符串)basePropertyInfo.GetValue(validationContext.ObjectInstance,NULL);
        VAR CurrentValue的=(字符串)值;
        串firstLetterBaseValue = baseValue.Substring(0,1);
        串firstLetterCurrentValue = currentValue.Substring(0,1);        //比较
        如果(!string.Equals(firstLetterBaseValue,firstLetterCurrentValue))
        {
            VAR消息= FormatErrorMessage(validationContext.DisplayName);
            返回新的ValidationResult(消息);
        }        //默认的回报 - 这意味着没有验证错误
        返回null;
    }
    公共IEnumerable的< System.Web.Mvc.ModelClientValidationRule> GetClientValidationRules(System.Web.Mvc.ModelMetadata元,System.Web.Mvc.ControllerContext上下文)
    {
        VAR规则=新System.Web.Mvc.ModelClientValidationRule();
        rule.ErrorMessage = FormatErrorMessage(metadata.GetDisplayName());
        rule.ValidationParameters.Add(其他,_basePropertyName);
        rule.ValidationType =greaterdate;
        产生回报规则;
    }}

}

查看

  @model MyValidationTEST.Person@ {
ViewBag.Title =创建;
}< H2>创建< / H><脚本的src =@ Url.Content(〜/脚本/ jQuery的-1.5.1.min.js)TYPE =文/ JavaScript的> < / SCRIPT>@ *不显眼* @
<脚本的src =@ Url.Content(〜/脚本/ jquery.validate.min.js)TYPE =文/ JavaScript的>< / SCRIPT>
<脚本的src =@ Url.Content(〜/脚本/ jquery.validate.unobtrusive.min.js)TYPE =文/ JavaScript的>< / SCRIPT><脚本类型=文/ JavaScript的>/ *注册适配器 - addSingleVal * /
jQuery.validator.unobtrusive.adapters.addSingleVal(greaterdate,其他);
/ *在不显眼的客户端验证规则验证类型名称只能由小写字母的* // * Add方法* /
jQuery.validator.addMethod(greaterdate
                                    功能(VAL,元素,其他)
                                    {                                        VAR模型$ P ​​$ PFIX = element.name.substr(0,element.name.lastIndexOf(。)+ 1)
                                        VAR otherVal = $([NAME =+模式preFIX +其他+])VAL()。                                        如果(VAL&安培;&安培; otherVal)
                                        {
                                            变种lastNameFirstLetter = val.substr(0,1);
                                            变种firstNameFirstLetter = otherVal.substr(0,1);                                            如果(lastNameFirstLetter!= firstNameFirstLetter)
                                            {
                                                返回false;
                                            }
                                        }
                                        返回true;
                                    });
< / SCRIPT>
@using(Html.BeginForm()){
@ Html.ValidationSummary(真)
<&字段集GT;
    <传奇>与人LT; /传说>    < D​​IV CLASS =编辑标记>
        @ Html.LabelFor(型号=> model.FirstName)
    < / DIV>
    < D​​IV CLASS =主编场>
        @ Html.EditorFor(型号=> model.FirstName)
        @ Html.ValidationMessageFor(型号=> model.FirstName)
    < / DIV>    < D​​IV CLASS =编辑标记>
        @ Html.LabelFor(型号=> model.LastName)
    < / DIV>
    < D​​IV CLASS =主编场>
        @ Html.EditorFor(型号=> model.LastName)
        @ Html.ValidationMessageFor(型号=> model.LastName)
    < / DIV>    < D​​IV CLASS =编辑标记>
        @ Html.LabelFor(型号=> model.Age)
    < / DIV>
    < D​​IV CLASS =主编场>
        @ Html.EditorFor(型号=> model.Age)
        @ Html.ValidationMessageFor(型号=> model.Age)
    < / DIV>    &所述p为H.;
        <输入类型=提交值=创建/>
    &所述; / P>
< /字段集>
}< D​​IV>
@ Html.ActionLink(返回目录,索引)
< / DIV>

控制器:

 使用System.Web.Mvc;
命名空间MyValidationTEST.Controllers
{
公共类RelativesController:控制器
{    // GET:/亲属/
    公众的ActionResult指数()
    {
        返回查看();
    }    // GET:/亲属/创建
    公众的ActionResult的Create()
    {
        人人=新的Person();
        返回查看(人);
    }
    // POST:/亲属/创建
    [HttpPost]
    公众的ActionResult创建(人relativeToAdd)
    {
        如果(ModelState.IsValid)
        {
            返回RedirectToAction(「指数」);
        }
        返回查看(relativeToAdd);
    }    } }

阅读:

ASP.NET MVC3 - 自定义验证属​​性 - >客户端断


解决方案

You can use only lowercase letters for the ValidationType property:

rule.ValidationType = "anotherdefaulttype";

and then adapt your client script to reflect this modification:

jQuery.validator.unobtrusive.adapters.addSingleVal("anotherdefaulttype", "other");
jQuery.validator.addMethod("anotherdefaulttype", function (val, element, other) {
    ...
});

这篇关于ASP.NET MVC3:ValidationType ModelClientValidationRule的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持!

06-21 03:03