標籤: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>}
效果: