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

来源:互联网 发布:数据库物理设计实例 编辑:程序博客网 时间:2024/05/30 04:11

提示:保存后才提示错误信息

 

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

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

复制代码
using System.ComponentModel.DataAnnotations;using System.Globalization;using System.Web.Mvc;namespace MvcValidation.Extension{    public class NotEqualToAttribute : ValidationAttribute,IClientValidatable    {        public string OtherProperty { get; set; }        public NotEqualToAttribute(string otherProperty)        {            OtherProperty = otherProperty;        }        protected override ValidationResult IsValid(object value, ValidationContext validationContext)        {            //从验证上下文中可以获取我们想要的的属性            var property = validationContext.ObjectType.GetProperty(OtherProperty);            if (property == null)            {                return new ValidationResult(string.Format(CultureInfo.CurrentCulture, "{0} 不存在", OtherProperty));            }            //获取属性的值            var otherValue = property.GetValue(validationContext.ObjectInstance, null);            if (object.Equals(value, otherValue))            {                return new ValidationResult(FormatErrorMessage(validationContext.DisplayName));            }            return null;        }        public System.Collections.Generic.IEnumerable<ModelClientValidationRule> GetClientValidationRules(ModelMetadata metadata, ControllerContext context)        {            var rule = new ModelClientValidationRule            {                ValidationType = "notequalto",                ErrorMessage = FormatErrorMessage(metadata.GetDisplayName())            };            rule.ValidationParameters["other"] = OtherProperty;            yield return rule;        }    }}
复制代码

  View model

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

复制代码
 public class RegisterModel    {        [Required]        [StringLength(6, MinimumLength = 2)] //加        [Display(Name = "用户名")]        //[Remote("CheckUserName","Validate", ErrorMessage = "远程验证用户名失败")]        [NoInput("demo,jack",ErrorMessage = "不能使用此名称")]        public string UserName { get; set; }        [Required]        [DataType(DataType.EmailAddress)]        [Display(Name = "邮件")]        //[Email]        public string Email { get; set; }        [Required]        [StringLength(100, ErrorMessage = "{0}栏位最少{2}个字,最多{1}个字", MinimumLength = 6)]        [DataType(DataType.Password)]        [Display(Name = "密码")]        public string Password { get; set; }        [DataType(DataType.Password)]        [Display(Name = "确认密码")]        [System.ComponentModel.DataAnnotations.Compare("Password", ErrorMessage = "密码和确认密码不匹配。")]        public string ConfirmPassword { get; set; }        [NotEqualTo("UserName", ErrorMessage = "不能与用户名的值相同")]        public string OtherName { get; set; }    }
复制代码

 在mvc中,密码比较使用

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

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

jQuery.validator.addMethod('notEqualTo', function(value, element, param) {
    //意思是表单值为空时也能通过验证
    //但,如果表单有值,就必须满足||后面的条件,否则返回false
    return this.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;
    }
});   

 

  Register.cshtml视图

复制代码
@model MvcValidation.Models.RegisterModel@{    ViewBag.Title = "注册";}<hgroup class="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>        <input type="submit" value="注册" />    </fieldset>}@section Scripts {    @Scripts.Render("~/bundles/jqueryval")    <script src="~/Scripts/jQuery.validator.noteaualto.js"></script>}
复制代码

 

效果:

不能相同

 

转自:http://www.csharpwin.com/dotnetspace/13573r4911.shtml

0 0
原创粉丝点击