您的位置:首页 > 编程语言 > ASP

ASP.NET MVC验证 - 自定义验证规则、验证2个属性值不等【待验证】

2015-07-22 10:59 519 查看
提示:保存后才提示错误信息

自定义验证特性,继承ValidationAttribute并实现IClientValidatable

这次重写了基类的IsValid()方法的另外一个重载,因为该重载包含了验证上下文ValidationContext,从中可以获取属性及属性值。

usingSystem.ComponentModel.DataAnnotations;
usingSystem.Globalization;
usingSystem.Web.Mvc;

namespaceMvcValidation.Extension
{
publicclassNotEqualToAttribute:ValidationAttribute,IClientValidatable
{
publicstringOtherProperty{get;set;}

publicNotEqualToAttribute(stringotherProperty)
{
OtherProperty=otherProperty;
}

protectedoverrideValidationResultIsValid(objectvalue,ValidationContextvalidationContext)
{
//从验证上下文中可以获取我们想要的的属性
varproperty=validationContext.ObjectType.GetProperty(OtherProperty);
if(property==null)
{
returnnewValidationResult(string.Format(CultureInfo.CurrentCulture,"{0}不存在",OtherProperty));
}

//获取属性的值
varotherValue=property.GetValue(validationContext.ObjectInstance,null);
if(object.Equals(value,otherValue))
{
returnnewValidationResult(FormatErrorMessage(validationContext.DisplayName));
}
returnnull;
}

publicSystem.Collections.Generic.IEnumerable<ModelClientValidationRule>GetClientValidationRules(ModelMetadatametadata,ControllerContextcontext)
{
varrule=newModelClientValidationRule
{
ValidationType="notequalto",
ErrorMessage=FormatErrorMessage(metadata.GetDisplayName())
};
rule.ValidationParameters["other"]=OtherProperty;
yieldreturnrule;
}
}
}


Viewmodel

[NotEqualTo("UserName",ErrorMessage="不能与用户名的值相同")]用来比较属性UserName的值。

publicclassRegisterModel
{
[Required]
[StringLength(6,MinimumLength=2)]//加
[Display(Name="用户名")]
//[Remote("CheckUserName","Validate",ErrorMessage="远程验证用户名失败")]
[NoInput("demo,jack",ErrorMessage="不能使用此名称")]
publicstringUserName{get;set;}

[Required]
[DataType(DataType.EmailAddress)]
[Display(Name="邮件")]
//[Email]
publicstringEmail{get;set;}

[Required]
[StringLength(100,ErrorMessage="{0}栏位最少{2}个字,最多{1}个字",MinimumLength=6)]
[DataType(DataType.Password)]
[Display(Name="密码")]
publicstringPassword{get;set;}

[DataType(DataType.Password)]
[Display(Name="确认密码")]
[System.ComponentModel.DataAnnotations.Compare("Password",ErrorMessage="密码和确认密码不匹配。")]
publicstringConfirmPassword{get;set;}

[NotEqualTo("UserName",ErrorMessage="不能与用户名的值相同")]
publicstringOtherName{get;set;}
}


在mvc中,密码比较使用

[System.Web.Mvc.Compare("Password",ErrorMessage="密码和确认密码不匹配。")]


扩展jquery的验证,jQuery.validator.noteaualto.js

jQuery.validator.addMethod('notEqualTo',function(value,element,param){

[code]//意思是表单值为空时也能通过验证
//但,如果表单有值,就必须满足||后面的条件,否则返回false

returnthis.optional(element)||value!=$(param).val();

});


//第一个参数是jquery验证扩展方法名

//第二个参数与rule.ValidationParameters["other"]中的key对应

//option是指ModelClientValidationRule对象实例

jQuery.validator.unobtrusive.adapters.add('notequalto',['other'],function(options){

options.rules['notEqualTo']='#'+options.params.other;

if(options.message){

options.messages['notEqualTo']=options.message;

}

});

[/code]

Register.cshtml视图

@modelMvcValidation.Models.RegisterModel
@{
ViewBag.Title="注册";
}

<hgroupclass="title">
<h1>@ViewBag.Title.</h1>
<h2>创建新帐户。</h2>
</hgroup>

@using(Html.BeginForm()){
@Html.AntiForgeryToken()
@Html.ValidationSummary()

<fieldset>
<legend>注册表单</legend>
<ol>
<li>
@Html.LabelFor(m=>m.UserName)
@Html.TextBoxFor(m=>m.UserName)
</li>
<li>
@Html.LabelFor(m=>m.Email)
@Html.TextBoxFor(m=>m.Email)
</li>
<li>
@Html.LabelFor(m=>m.Password)
@Html.PasswordFor(m=>m.Password)
</li>
<li>
@Html.LabelFor(m=>m.ConfirmPassword)
@Html.PasswordFor(m=>m.ConfirmPassword)
</li>
<li>
@Html.LabelFor(m=>m.OtherName)
@Html.TextBoxFor(m=>m.OtherName)
</li>
</ol>
<inputtype="submit"value="注册"/>
</fieldset>
}

@sectionScripts{
@Scripts.Render("~/bundles/jqueryval")
<scriptsrc="~/Scripts/jQuery.validator.noteaualto.js"></script>
}


效果:





转自:http://www.csharpwin.com/dotnetspace/13573r4911.shtml
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: