MVC驗證03-自訂驗證規則、禁止輸入某些值

來源:互聯網
上載者:User

標籤:style   blog   http   color   使用   width   

原文:MVC驗證03-自訂驗證規則、禁止輸入某些值

本文繼續體驗自訂驗證規則,需求是禁止輸入某些值。本文與前2篇相關,請參考:
MVC驗證01-基礎、遠程驗證  
MVC驗證02-自訂驗證規則、郵件驗證 

 

  自訂驗證特性繼承ValidationAttribute,並實現IClientValidatable介面

展開using System.ComponentModel.DataAnnotations;using System.Web.Mvc;namespace MvcValidation.Extension{    /// <summary>    /// 用來禁止屬性某個值的輸入    /// </summary>    public sealed class NoInputAttribute : ValidationAttribute, IClientValidatable    {        public string Input { get; set; }        public NoInputAttribute(string input)        {            this.Input = input;        }        public override bool IsValid(object value)        {            //如果沒有輸入值,允許存取            if (value == null)            {                return true;            }            if (value is string)            {                if (Input.Contains(value.ToString()))                {                    return false;                }            }            return true;        }        public System.Collections.Generic.IEnumerable<ModelClientValidationRule> GetClientValidationRules(ModelMetadata metadata, ControllerContext context)        {            ModelClientValidationRule rule = new ModelClientValidationRule            {                ValidationType = "noinput",                ErrorMessage = FormatErrorMessage(metadata.GetDisplayName())            };            rule.ValidationParameters["input"] = Input;            yield return rule;        }    }}

  把自訂屬性打到View model的屬性上

展開public class RegisterModel    {        [Required]        [StringLength(6, MinimumLength = 2)] //加        [Display(Name = "使用者名稱")]        [NoInput("demo",ErrorMessage = "不能使用此名稱")]        public string UserName { get; set; }        [Required]        [DataType(DataType.EmailAddress)]        [Display(Name = "郵件")]        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; }    }

[NoInput("demo",ErrorMessage = "不能使用此名稱")],即當輸入demo的時候就報錯。

  擴充jquery的驗證方法jQuery.validator.noinput.js並註冊

jquery的驗證擴充方法的邏輯基本上與自訂特性IsValid()方法一致。
自訂特性rule.ValidationParameters["input"]的鍵input要傳遞給$.validator.unobtrusive.adapters.addSingleVal()方法。

展開//擴充的方法名與NoInputAttribute保持一致,且是小寫//value是指前端輸入的值//element是指html元素//parm是指輸入的參數,即rule.ValidationParameters["input"]鍵input對應的值,通過NoInputAttribute的建構函式注入的$.validator.addMethod("noinput", function(value, element, param) {    if (value == false) { //如果value沒有輸入,這裡就允許存取        return true;    }    if (value.indexOf(param) != -1) { //如果前端輸入的值value包含自訂驗證特性NoInputAttribute的屬性Input值,就不允許存取        return false;    } else {        return true;    }});//第一個參數就是jquery驗證擴充方法名//第二個參數就是rule.ValidationParameters["input"]的鍵$.validator.unobtrusive.adapters.addSingleVal("noinput", "input");

  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>        </ol>        <input type="submit" value="註冊" />    </fieldset>}@section Scripts {    @Scripts.Render("~/bundles/jqueryval")    <script src="~/Scripts/jQuery.validator.noinput.js"></script>}

效果:

 

  如果需要禁止多個值,需要重寫自訂驗證特性

這時候自訂特性的Input屬性類型變成了string[],因為要判斷多個值。
但前台rule.ValidationParameters["input"]儲存的應該是string類型,所以儲存的時候要把Input數組元素join起來。

展開using System;using System.ComponentModel.DataAnnotations;using System.Web.Mvc;namespace MvcValidation.Extension{    /// <summary>    /// 用來禁止屬性某個值的輸入    /// </summary>    public sealed class NoInputAttribute : ValidationAttribute, IClientValidatable    {        public string[] Input { get; set; }        public NoInputAttribute(string input)        {            if (input.IndexOf(",") > -1)//如果輸入的字串有逗號分隔            {                //把字串分割成數組賦值給Input                this.Input = input.Split(new char[] {‘,‘}, StringSplitOptions.RemoveEmptyEntries);            }            else            {                //沒有逗號,就構建一個數組賦值給Input                this.Input = new string[]{input};            }        }        public override bool IsValid(object value)        {            //如果沒有輸入值,允許存取            if (value == null)            {                return true;            }            if (value is string)            {                if (string.Join(",", Input).Contains(value.ToString()))                {                    return false;                }            }            return true;        }        public System.Collections.Generic.IEnumerable<ModelClientValidationRule> GetClientValidationRules(ModelMetadata metadata, ControllerContext context)        {            ModelClientValidationRule rule = new ModelClientValidationRule            {                ValidationType = "noinput",                ErrorMessage = FormatErrorMessage(metadata.GetDisplayName())            };            rule.ValidationParameters["input"] = string.Join(",", Input);            yield return rule;        }    }}

  把自訂屬性打到View model的屬性上,但建構函式是用逗號分隔的字串

展開 public class RegisterModel    {        [Required]        [StringLength(6, MinimumLength = 2)] //加        [Display(Name = "使用者名稱")]        [NoInput("demo,jack",ErrorMessage = "不能使用此名稱")]        public string UserName { get; set; }        [Required]        [DataType(DataType.EmailAddress)]        [Display(Name = "郵件")]        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; }    }

[NoInput("demo,jack",ErrorMessage = "不能使用此名稱")],當輸入demo或者jack的時候都會報錯。

 

  擴充jquery的驗證方法jQuery.validator.noinput1.js並註冊

需要把rule.ValidationParameters["input"]儲存的值split成數組,在遍曆判斷。

展開//擴充的方法名與NoInputAttribute保持一致,且是小寫//value是指前端輸入的值//element是指html元素//parm是指輸入的參數,即rule.ValidationParameters["input"]鍵input對應的值,通過NoInputAttribute的建構函式注入的$.validator.addMethod("noinput", function (value, element, param) {    if (value == false) { //如果value沒有輸入,這裡就允許存取        return true;    }    var validateState = true;    //param就是自訂特性rule.ValidationParameters["input"]對應的值    var paramarr = param.split(‘,‘);    //第一個參數是數組元素的索引    //第二個參數是數組元素    $.each(paramarr, function(index, ele) {        if (value == ele) {            validateState = false;            return;        }    });    return validateState;});//第一個參數就是jquery驗證擴充方法名//第二個參數就是rule.ValidationParameters["input"]的鍵$.validator.unobtrusive.adapters.addSingleVal("noinput", "input");

  Register.cshmtl要引用jQuery.validator.noinput1.js

展開@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>        </ol>        <input type="submit" value="註冊" />    </fieldset>}@section Scripts {    @Scripts.Render("~/bundles/jqueryval")    <script src="~/Scripts/jQuery.validator.noinput1.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.