例如:Range、RegularExpression、Required、StringLength等驗證屬性,這些屬性極大的方便了伺服器端的驗證,同時我們還可以自訂驗證屬性來滿足我們特殊的需求,MVC3的出現進一步提升了驗證的便捷性,具體體現在,新增了IValidatableObject和IClientValidatable介面,以及預設支援Range、RegularExpression、Required、StringLength等驗證屬性在用戶端和伺服器端進行驗證。
IValidatableObject介面,網上已經有很多的資料了,今天我主要介紹IClientValidatable這個介面,IClientValidatable 介面允許 ASP.NET MVC 在運行時發現支援的用戶端驗證器,這個介面被用來支援整合不同的驗證架構——摘自:ASP.NET MVC3概述。
下面我們就來看看如何使用IClientValidatable介面來實現用戶端和伺服器端的驗證。
首先我們來自訂一個驗證屬性NoIsAttribute.cs,該屬性的主要作用是驗證使用者名稱中不能含有指定的字串,代碼如下:
public sealed class NoIsAttribute:ValidationAttribute { public string InputString { get; set; } public NoIsAttribute() { ErrorMessage = "驗證失敗"; } public override bool IsValid(object value) { if (value == null) return true; string inputString = (string)value; if (inputString.Contains(InputString)) { return false; } return true; } }
下面我們來建立一個實體類Logon.cs
public class Logon { [DisplayName("年齡")] [Range(6,100)] public int Age { get; set; } [DisplayName("姓名")] [NoIs(InputString="蔔俊生",ErrorMessage="使用者名稱不能含有蔔俊生")] public string Name { get; set; } }
在Logon.cs中我們對Name屬性應用了Nois驗證屬性,這樣使用者在登入過程中如果輸入了包含“蔔俊生”,那麼將無法通過驗證,不過該屬性只能當使用者將資料提交到伺服器後才能對資料進行驗證,(其中Age屬性應用了Range驗證屬性,因為asp.net mvc3預設支援對range進行用戶端驗證,所以當使用者輸入年齡後,如果年齡不符合要求則在用戶端進行驗證。),為了讓NoIs驗證屬性也能在用戶端進行驗證,我們就需要將NoIsAttribute.cs實現IClientValidatable介面,所以我們要改造我們的NoIsAttribute.cs代碼。
public sealed class NoIsAttribute:ValidationAttribute,IClientValidatable { public string InputString { get; set; } public NoIsAttribute() { ErrorMessage = "驗證失敗"; } public IEnumerable<ModelClientValidationRule> GetClientValidationRules(ModelMetadata metadata, ControllerContext context) { ModelClientValidationRule rule = new ModelClientValidationRule { ValidationType = "nois", 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; } }
IClientValidatable 介面很簡單,他只有一個GetClientValidationRules()方法,我們只要實現這個方法就可以了,這個方法包括兩個參數,metadata表示要驗證的屬性的中繼資料,context表示發送請求的Controller的上下文,並且它返回一個ModelClientValidationRule集合。
我們先來看看這段代碼:
ModelClientValidationRule rule = new ModelClientValidationRule { ValidationType = "nois", ErrorMessage = FormatErrorMessage(metadata.GetDisplayName()) };
這段代碼是建立一個ModelClientValidationRule對象,並且為其兩個屬性賦值,其中ValidationType是驗證類型(用戶端代碼需要調用該屬性),ErrorMessage是錯誤資訊。
讓後我們再來看看下面這句代碼:
rule.ValidationParameters["inputstring"] = InputString;
這句代碼的意思是添加一個驗證屬性”inputstring”,它的值是InputString,需要注意的是ValidationParameters是一個IDictionary<string,object>字典,最重要的是ValidationParameters的key必須是小寫,不能包含任何大寫字母,否則運行時會報錯,請一定要謹記。
IClientValidatable.cs完成後,我們還需要編寫用戶端代碼才能實現用戶端和伺服器端同時驗證。
預設情況下asp.net mvc3已經開啟了用戶端驗證和隱藏驗證,這一點我們可以在web.config中查看
<appSettings> <add key="ClientValidationEnabled" value="true"/> <add key="UnobtrusiveJavaScriptEnabled" value="true"/> </appSettings>
那麼預設情況下asp.net mvc3使用jquery的Validate外掛程式進行用戶端驗證,所以你會在View檔案中看見圖下代碼
<script src="@Url.Content("~/Scripts/jquery.validate.min.js")" type="text/javascript"></script><script src="@Url.Content("~/Scripts/jquery.validate.unobtrusive.min.js")" type="text/javascript"></script>
下面我們就要為validate外掛程式編寫自訂驗證規則,並將規則添加到unobtrusive中,代碼如下:
<script type="text/javascript"> $.validator.addMethod("nois", function (value, element, param) { if (value == false) { return true; } if (value.indexOf(param) != -1) { return false; } else { return true; } }); $.validator.unobtrusive.adapters.addSingleVal("nois","inputstring");</script>
如要注意的是addMethod這個函數的第一個參數值必須和IClientValidatable.cs中的ValidationType的值必須一致,都必須是”nois”,還有就是 $.validator.unobtrusive.adapters.addSingleVal("nois","inputstring"); 這一句中的第二個參數值要和ValidationParameters的key的值相同,必須是“inputstring“。
這樣就可實現用戶端和伺服器端同時驗證了,有興趣的朋友可以試下。