zoukankan      html  css  js  c++  java
  • ASP.NET MVC验证

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

    自定义验证特性,继承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

  • 相关阅读:
    About Spring
    execle导入后 数据 无刷新 显示在 输入页面
    前端小神龟 -- 分页导航栏
    如何在mysql命令窗口获取到程序正在执行的sql语句
    div+css(ul li)实现图片上文字下列表布局
    C#异常之(已有打开的与此 Command 相关联,已有打开的与此命令相关联的 DataReader,必须首先将它关闭。)
    台灣VR內容產業聯盟_技術推廣中心
    2014新的一年到来,祝大家新年快乐
    matlab 提取文件路径名称,用于实现遍历读取文件(我的目的是遍历图像)
    无监督学习一些算法的简要概括(一)-稀疏自编码
  • 原文地址:https://www.cnblogs.com/xcsn/p/4666718.html
Copyright © 2011-2022 走看看