MVC驗證04-自訂驗證規則、日期範圍驗證

來源:互聯網
上載者:User

標籤:style   blog   http   color   使用   width   

原文: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‘);

 

  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>}

效果:

相關文章

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.