MVC验证04-自定义验证规则、日期范围验证

原文:MVC验证04-自定义验证规则、日期范围验证

本文体验范围验证。与本文相关的包括:

MVC验证01-基础、远程验证  
MVC验证02-自定义验证规则、邮件验证  
MVC验证03-自定义验证规则、禁止输入某些值

当需要对字符串长度进行验证,可以用StringLength:
[StringLength(100, ErrorMessage = "{0} 必须至少包含 {2} 个字符。", MinimumLength = 6)]

当需要对数组范围进行验证,可以用Range:
[Range(0,5)]

如果需要对日期范围进行验证呢?
假设来验证日期,以当前日期为基准,介于当前日期和第七天之间的日期为有效,其它无效。

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

重写基类ValidationAttribute的IsValid()方法,是为了服务端验证用的。
实现IClientValidatable接口方法,是为了在前端html元素增加某个属性,好让jquery侦测到。

展开using System;
using System.ComponentModel.DataAnnotations;
using System.Web.Mvc;

namespace MvcValidation.Extension
{
    public class DayRangeAttribute : ValidationAttribute, IClientValidatable
    {
        private int _minDay;
        private int _maxDay;

        public DayRangeAttribute(int minDay, int maxDay)
        {
            if (minDay.CompareTo(maxDay) > -1)
            {
                throw new Exception("最小日期不能大于或等于最大日期");
            }
            this._minDay = minDay;
            this._maxDay = maxDay;
        }

        public override bool IsValid(object value)
        {
            if (value == null)
                return true;
            var compareDate = value as DateTime?;
            if (compareDate.HasValue)
            {
                compareDate = compareDate.Value.Date;
                return compareDate.Value >= DateTime.Today.AddDays(_minDay).Date &&
                       compareDate.Value <= DateTime.Today.AddDays(_maxDay).Date;
            }
            return false;
        }

        public System.Collections.Generic.IEnumerable<ModelClientValidationRule> GetClientValidationRules(ModelMetadata metadata, ControllerContext context)
        {
            var rule = new ModelClientValidationRule
            {
                ValidationType = "dayrange", //这里的dayrange最终会成为data-val-dayrange属性被jquery侦测到
                ErrorMessage = FormatErrorMessage(metadata.GetDisplayName())
            };
            //这里了的min和max将会作为jquery验证扩展方法的参数
            rule.ValidationParameters["min"] = _minDay;
            rule.ValidationParameters["max"] = _maxDay;
            yield return rule;
        }
    }
}

注意:
■ ValidationType = "dayrange"中的dayrange必须小写,否则报错。
■ ValidationType = "dayrange"最终成为html元素的一个属性data-val-dayrange,从而能被jquery侦测辨别。
■ rule.ValidationParameters["min"]和rule.ValidationParameters["max"],min和max将作为参数供jquery扩展方法使用,当然也必须是小写。

把自定义验证特性打到View model上

[DayRange(0, 7)]验证当天到第七天之内的日期。

展开 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; }

        [DayRange(0, 7)]
        [Display(Name = "上课时间")]
        public DateTime ClassDate { 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; }

扩展jquery验证jQuery.validator.dayrange.js

//扩展jquery验证方法
//第一个参数是前端输入的值
//第二个参数是html元素
//第三个参数是自定义验证特性DayRangeArribute中rule.ValidationParameters["min"]和rule.ValidationParameters["max"]的键值
jQuery.validator.addMethod(‘dayrange‘, function(value, element, param) {
    if (!value) {
        return false;
    }
    //value:1999/1/1
    var valueDateParts = value.split(‘-‘);
    var minDate = new Date();
    var maxDate = new Date();
    var now = new Date();
    var dateValue = new Date(valueDateParts[2],
                        (valueDateParts[1] - 1),
                         valueDateParts[0],
                         now.getHours(),
                         now.getMinutes(),
                         (now.getSeconds() + 5));
 
    minDate.setDate(minDate.getDate() - parseInt(param.min));
    maxDate.setDate(maxDate.getDate() + parseInt(param.max));
 
    return dateValue >= minDate && dateValue <= maxDate;
});
 
//第一个参数是jquery验证扩展方法名
//第二和第三个参数分别是最小或最大值
//第三个参数为DayRangeAttribute中ValidationType对应的值
jQuery.validator.unobtrusive.adapters.addMinMax(‘dayrange‘, ‘min‘, ‘max‘, ‘dayrange‘);

.csharpcode, .csharpcode pre
{
font-size: small;
color: black;
font-family: consolas, "Courier New", courier, monospace;
background-color: #ffffff;
/*white-space: pre;*/
}
.csharpcode pre { margin: 0em; }
.csharpcode .rem { color: #008000; }
.csharpcode .kwrd { color: #0000ff; }
.csharpcode .str { color: #006080; }
.csharpcode .op { color: #0000c0; }
.csharpcode .preproc { color: #cc6633; }
.csharpcode .asp { background-color: #ffff00; }
.csharpcode .html { color: #800000; }
.csharpcode .attr { color: #ff0000; }
.csharpcode .alt
{
background-color: #f4f4f4;
width: 100%;
margin: 0em;
}
.csharpcode .lnum { color: #606060; }

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.ClassDate)
                @Html.TextBoxFor(m => m.ClassDate)
            </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>
        </ol>
        <input type="submit" value="注册" />
    </fieldset>
}

@section Scripts {
    @Scripts.Render("~/bundles/jqueryval")
    <script src="~/Scripts/jQuery.validator.dayrange.js"></script>
}

效果:

MVC验证04-自定义验证规则、日期范围验证,布布扣,bubuko.com

时间: 2024-10-12 22:43:48

MVC验证04-自定义验证规则、日期范围验证的相关文章

【MVC】中自定义扩展类实现客户端验证

照图片一步一步做,你就会成功的~ 哈哈 注意细节哦~

ASP.NET MVC如何实现自定义验证(服务端验证+客户端验证)

ASP.NET MVC通过Model验证帮助我们很容易的实现对数据的验证,在默认的情况下,基于ValidationAttribute的声明是验证被使用,我们只需 要将相应的ValidationAttribute应用到Model的类型或者属性上即可.对于自定义验证,我们也只需要定义相应的Validation 就可以了,不过服务端验证比较简单,而客户端验证就要稍微复杂一些,本文提供一个简单的实例说明在ASP.NET MVC中实现自定义验证的基本步骤.[源代码从这里下载] 一.AgeRangeAttr

MVC验证02-自定义验证规则、邮件验证

原文:MVC验证02-自定义验证规则.邮件验证 本文体验MVC自定义验证特性,来实现对邮件的验证.对于刚写完的自定义验证特性,起初只能支持后端验证.如果要让前端jquery支持,还必须对jquery的验证进行扩展. 本文与"MVC验证01-基础.远程验证"相关,如有需要,请参考. 当我们验证有关Email属性的时候,我们可能这样写: [RegularExpression(@"\w.+\@\w.+")] public string Email { get; set;

mvc 实体类 自定义验证特性

mvc 实体类验证的时候 如果有多个验证特性需要在属性上层叠很多个验证特性,显得属性特别臃肿并且也不够直观,极大地影响我使用它的兴趣,所以我想自定义一个验证特性,然后将所有需要验证的情形全部放在一个特性里,看上去更直观一点. [DataContract] public partial class Sys_Menu : BaseModel { [Key] [DatabaseGenerated(DatabaseGeneratedOption.Identity)] [DataMember] publi

《ASP.NET MVC 4 实战》学习笔记 6:验证

本书<视图模型>这一章所讲内容在前面均有提及且未作更深入讲解故略过,进入下一章: 一.服务器端验证: 无论客户端验证与否,都应该执行服务器端验证.因为用户可能会禁用JavaScript或者做一些意想不到的事情来绕过客户端验证,而服务器验证是保护数据.防止劣质输入的最后一道防线.有些验证规则也需要服务器端进行处理,如网络拓扑可能会要求只有服务器才能访问对输入进行验证所需要的某些外部资源. 1.Data Annotations验证:[本节内容前面亦有提及] Data Annotations的注解属

MVC验证11-对复杂类型使用jQuery异步验证

原文:MVC验证11-对复杂类型使用jQuery异步验证 本篇体验使用"jQuery结合Html.BeginForm()"对复杂类型属性进行异步验证.与本篇相关的"兄弟篇"包括: MVC验证08-jQuery异步验证    MVC验证09-使用MVC的Ajax.BeginForm方法实现异步验证    MVC验证10-到底用哪种方式实现客户端服务端双重异步验证 准备工作 □ js方面:1.jquery的某个版本2.jquery.validate.js3.jquery

报错:非介入式客户端验证规则中的验证类型名称必须唯一。下列验证类型出现重复

当在ASP.NET MVC中,针对一个Model进行添加操作的时候,报如下错误: [InvalidOperationException: 非介入式客户端验证规则中的验证类型名称必须唯一.下列验证类型出现重复: range] 原因是第三方验证程序集和MVC固有验证发生名称的冲突. 解决办法:在Model中属性上注释掉第三方程序集提供的验证特性.

jQuery Validate 表单验证插件----自定义一个验证方法

一.下载依赖包 网盘下载:https://yunpan.cn/cryvgGGAQ3DSW  访问密码 f224 二.引入依赖包 <script src="../../scripts/jquery-1.3.1.js" type="text/javascript"></script> <script src="lib/jquery.validate.js" type="text/javascript"

.NET 实现自定义ContextUser的Identity和Principal实现自定义用户信息,权限验证。

备用收藏,http://blog.csdn.net/msdnxgh/article/details/6894885 .NET 实现自定义ContextUser的Identity和Principal 在传统的.NET中,我们可以通过 [csharp] view plaincopy User.Identity.Name;//获取用户名 User.Identity.IsAuthenticated;//判断用户是否己验证 User.IsInRole("Admin");//判断用户是否含有指定角