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

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

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

扩展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

时间: 2024-10-21 12:56:19

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

MVC验证05-自定义验证规则、验证2个属性值不等

原文:MVC验证05-自定义验证规则.验证2个属性值不等 本文体验2个属性值不等.即当一个属性输入值,另外一个属性输入的值不能和第一个属性值相等.相关文章包括: MVC验证01-基础.远程验证   MVC验证02-自定义验证规则.邮件验证   MVC验证03-自定义验证规则.禁止输入某些值   MVC验证04-自定义验证规则.日期范围验证 自定义验证特性,继承ValidationAttribute并实现IClientValidatable 这次重写了基类的IsValid()方法的另外一个重载,因

asp.net mvc输出自定义404等错误页面,非302跳转。

朋友问到一个问题,如何输出自定义错误页面,不使用302跳转.当前页面地址不能改变. 还要执行一些代码等,生成一些错误信息,方便用户提交反馈. 500错误,mvc框架已经有现成解决方法: filters.Add(new HandleErrorAttribute()); 404错误目前想到的解决方法: 先上代码 Global.asax: 1 protected void Application_Error(object sender, EventArgs e) 2 { 3 var ex = Serv

转:【译】Asp.net MVC 利用自定义RouteHandler来防止图片盗链

[译]Asp.net MVC 利用自定义RouteHandler来防止图片盗链 你曾经注意过在你服务器请求日志中多了很多对图片资源的请求吗?这可能是有人在他们的网站中盗链了你的图片所致,这会占用你的服务器带宽.下面这种方法可以告诉你如何在ASP.NET MVC中实现一个自定义RouteHandler来防止其他人盗链你的图片. 首先,我们来回顾一下当一个请求发往ASP.net MVC站点时的情景,IIS收到请求并将请求转到ASP.net,然后根据URL,或者更确切来说:被请求文件的扩展名.在IIS

【转】Asp.net MVC 通过自定义ControllerFactory实现构造器注入(重写DefaultControllerFactory)

[转]Asp.net MVC 通过自定义ControllerFactory实现构造器注入 一.重写ControllerFactory的GetControllerInstance ControllerFactory是asp.net中用于在运行时构造Controller的工厂 ,默认使用的工厂在构造Controller时,默认调用Controller的无参构造函数,所以要实现构造器注入,需要重写工厂中构造Controller的方法GetControllerInstance: 1 public cla

asp.net MVC之 自定义过滤器(Filter) - shuaixf

一.系统过滤器使用说明 1.OutputCache过滤器 OutputCache过滤器用于缓存你查询结果,这样可以提高用户体验,也可以减少查询次数.它有以下属性: Duration :缓存的时间, 以秒为单位 ,理论上缓存时间可以很长,但实际上当系统资源紧张时,缓存空间还是会被系统收回. VaryByParam :以哪个字段为标识来缓存数据,比如当"ID"字段变化时,需要改变缓存(仍可保留原来的缓存),那么应该设VaryByParam为"ID".这里你可以设置以下几

ASP.NET MVC下自定义错误页和展示错误页的几种方式

在网站运行中,错误是不可避免的,错误页的产生也是不可缺少的. 这几天看了博友的很多文章,自己想总结下我从中学到的和实际中配置的. 首先,需要知道产生错误页的来源,一种是我们的.NET平台抛出的,一种是网站所依赖的宿主抛出的,一般来讲我们所依赖的宿主就是IIS了. IIS中的错误页入口: 其中的错误码想必并不陌生 这里是在服务器上找不到所需资源时抛出的错误页,在这里可以设置需要展示的错误页面,只需将预定的错误页面加入服务器中,然后在指定状态码下配置路径即可. 这是请求在IIS中时,还未完全进入到a

转载:ASP.NET MVC扩展自定义视图引擎支持多模板&amp;动态换肤skins机制

ASP.NET mvc的razor视图引擎是一个非常好的.NET MVC框架内置的视图引擎.一般情况我们使用.NET MVC框架为我们提供的这个Razor视图引擎就足够了.但是有时我们想在我们的项目支持多模板&skins机制,比如我们可能会有多套的模板,也就是多个View风格,而我们只需要改一下配置文件就可以轻松的改变页面的风格和模板.实现这个功能有两种方式: 一.使用接口IViewEngine自己完成一个类似Razor视图引擎的功能. 二.继承类RazorViewEngine类,重写它的一些方

ASP.NET MVC API 路由生成规则

我们都知道调用ASP.NET MVC的某些API函数(诸如:Url.Action.RedirectToAction等)可以生成URL,ASP.NET MVC会根据调用API函数时传入的参数去匹配系统定义的路由(Route),然后通过匹配成功的路由去生成相应的URL. ASP.NET MVC会依次根据如下三个规则生成URL: 调用ASP.NET MVC API函数时传入的参数信息 当前请求的URL(就是Request.Url)和系统中定义路由匹配(按照路由表定义的顺序,从上往下匹配)后的匹配值 系

ASP.NET MVC 的自定义模型绑定

最近在研究 ASP.NET MVC 模型绑定,发现 DefaultModelBinder 有一个弊端,就是无法实现对浏览器请求参数的自定义,最初的想法是想为实体模型的属性设置特性(Attribute),然后通过取得设置的特性值对属性进行赋值,研究了好久 MVC 源码之后发现可以通过重写 DefaultModelBinder 的 BindProperty 方法可以达到预期的目的. ASP.NET MVC 中有一个自定义模型绑定特性 CustomModelBinderAttribute,打算通过重写