文章出處

回到目錄

開發它的原因:

之前的同事,也是我的哥們,問我下拉列表框是否可以支持驗證,這個問題看似簡單,但確實MVC里有為我們提供,所以,只能自己寫個擴展了,即自己寫一個attribute特性,讓它繼承ValidationAttribute,使它可以與其它MVC提供的驗證一起使用.

MVC驗證是怎么運行的:

在MVC的特性驗證,很方便,很直接,它無論是在數據安全性上還是在頁面表現上都做的不錯,它的運行機制是這樣的,前臺表單驗證規則有個名稱,然后前臺JS有對這個規則編寫的代碼,用來控制前臺HTML標記的顯示,而后臺主要是生成驗證規則和向前臺參數賦值的。事實上,我們要知道的是,MVC驗證不是簡單的后臺驗證,它還有對前臺頁面的控制的JS部分,它一般被繼承到了jquery.validate.min.js里了,如果我們要是自己開發一套驗證規則,也需要自己的JS庫與相配合。

說干就干

C#部分:

   [AttributeUsage(AttributeTargets.Property | AttributeTargets.Field | AttributeTargets.Parameter, AllowMultiple = false)]
    public sealed class NotDefaultValueAttribute : ValidationAttribute, IClientValidatable
    {
        public string InputString { get; set; }
        public NotDefaultValueAttribute()
        {
            ErrorMessage = "請選其中一項";
        }
        public IEnumerable<ModelClientValidationRule> GetClientValidationRules(ModelMetadata metadata, ControllerContext context)
        {
            ModelClientValidationRule rule = new ModelClientValidationRule
           {
               ValidationType = "notdefaultvalue",
               ErrorMessage = FormatErrorMessage(metadata.GetDisplayName())
           };
            rule.ValidationParameters["inputstring"] = InputString;

            yield return rule;
        }
        public override bool IsValid(object value)
        {
            if (value == null)
                return true;
            string inputString = (string)value;
            if (inputString.Contains(InputString))
            {
                return false;
            }
            return true;
        }
    }

為viewmodel添加特性

  public class TestModel
    {
        [Required]
        [Display(Name = "用戶名")]
        public string UserName { get; set; }

        [Required]
        [DataType(DataType.Password)]
        [Display(Name = "密碼")]
        public string Password { get; set; }

        [Display(Name = "愛好")]
        [NotDefaultValue(InputString = "1")]/*如果用戶選擇為1,則驗證不通過*/
        public IEnumerable<SelectListItem> Liker { get; set; }
    }

在前面添加相對應的JS代碼,建議將自定義的JS庫放在一個單獨的文件里,這樣擴展性更強一些。

    $.validator.addMethod('notdefaultvalue', function (value, element, param) {
        if (value == false) {
            return true;
        }
        if (value.indexOf(param) != -1) {
            return false;
        }
        else {
            return true;
        }
    });
    $.validator.unobtrusive.adapters.addSingleVal('notdefaultvalue', 'inputstring');

OK,現在就可以運行我們的程序了,看看效果吧

怎么樣,像這種擴展,我們還可以寫很多,舉一反三吧,呵呵!

回到目錄


文章列表




Avast logo

Avast 防毒軟體已檢查此封電子郵件的病毒。
www.avast.com


arrow
arrow
    全站熱搜
    創作者介紹
    創作者 大師兄 的頭像
    大師兄

    IT工程師數位筆記本

    大師兄 發表在 痞客邦 留言(0) 人氣()