愛上MVC3~為下拉列表框添加一個(ge)自定義驗證規則
開發它的原因:
之前的(de)(de)同事,也是(shi)我的(de)(de)哥們,問我下拉列表框是(shi)否(fou)可(ke)以(yi)(yi)支持(chi)驗(yan)證,這個問題(ti)看似簡單,但確(que)實MVC里有為我們提供,所(suo)以(yi)(yi),只能自己寫個擴(kuo)展了,即自己寫一個attribute特性,讓它繼承ValidationAttribute,使它可(ke)以(yi)(yi)與其它MVC提供的(de)(de)驗(yan)證一起使用.
MVC驗證是怎么運行的:
在MVC的特性驗證,很方便,很直接,它無論是在數據安全性上還是在頁面表現上都做的不錯,它的運行機制是這樣的,前臺表單驗證規則有個名稱,然后前臺JS有對這個規則編寫的代碼,用來控制前臺HTML標記的顯示,而后臺主要是生成驗證規則和向前臺參數賦值的。事實上,我們要知道的是,MVC驗證不是簡單的后臺驗證,它還有對前臺頁面的控制的JS部分,它一般被繼承到了jquery.validate.min.js里了,如果我們要是自己開發一套驗證規則,也需要自己的JS庫與相配合。
說干(gan)就干(gan)
C#部分(fen):
[AttributeUsage(AttributeTargets.Property | AttributeTargets.Field | AttributeTargets.Parameter, AllowMultiple = false)] public sealed class NotDefaultValueAttribute : ValidationAttribute, IClientValidatable { public string InputString { get; set; } public NotDefaultValueAttribute() { ErrorMessage = "請(qing)選其中一項"; } 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添加(jia)特性
public class TestModel { [Required] [Display(Name = "用戶名")] public string UserName { get; set; } [Required] [DataType(DataType.Password)] [Display(Name = "密碼")] public string Password { get; set; } [Display(Name = "愛好(hao)")] [NotDefaultValue(InputString = "1")]/*如果用戶選擇為1,則驗(yan)證不通過*/ public IEnumerable<SelectListItem> Liker { get; set; } }
在前面添加相對(dui)應的JS代碼,建議將自定(ding)義(yi)的JS庫放在一(yi)個單獨的文(wen)件(jian)里,這樣擴展性更強(qiang)一(yi)些(xie)。
$.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,現在(zai)就可以運行我們的程序了,看(kan)看(kan)效果吧
怎(zen)么樣,像這種擴展(zhan),我們還可以寫(xie)很(hen)多(duo),舉(ju)一反(fan)三(san)吧(ba),呵(he)呵(he)!