文章出處
文章列表
開發它的原因:
之前的同事,也是我的哥們,問我下拉列表框是否可以支持驗證,這個問題看似簡單,但確實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,現在就可以運行我們的程序了,看看效果吧
怎么樣,像這種擴展,我們還可以寫很多,舉一反三吧,呵呵!
文章列表
全站熱搜