您好,登錄后才能下訂單哦!
ASP.NETMVC Model驗(yàn)證(五)
前言
上篇主要講解ModelValidatorProvider和ModelValidator兩種類型的自定義實(shí)現(xiàn),然而在MVC框架中還給我們提供了其它方式來進(jìn)行Model驗(yàn)證,也就是本篇的主題,使用框架提供給我們的一系列的特性類型來進(jìn)行Model驗(yàn)證,當(dāng)然也是可以自定義的,在下面的演示示例中,我會使用我們自己自定義的特性類型(繼承自ValidationAttribute類型)到自定義Model綁定器中來模擬一下實(shí)現(xiàn)。
Model驗(yàn)證
Model驗(yàn)證簡單運(yùn)用示例
ModelValidator使用生成過程
自定義實(shí)現(xiàn)DefaultModelBinder進(jìn)行驗(yàn)證
自定義ModelValidatorProvider 和ModelValidator
ValidationAttribute特性類使用
自定義ValidationAttribute特性類的示例實(shí)現(xiàn)
ValidationAttribute特性類使用
我們首先看一下ValidationAttribute類型的定義,示例代碼1-1。
代碼1-1
public abstract class ValidationAttribute: Attribute { protectedValidationAttribute(); protectedValidationAttribute(Func<string> errorMessageAccessor); protectedValidationAttribute(string errorMessage); // 摘要: // 獲取或設(shè)置一條在驗(yàn)證失敗的情況下與驗(yàn)證控件關(guān)聯(lián)的錯(cuò)誤消息。 // // 返回結(jié)果: // 與驗(yàn)證控件關(guān)聯(lián)的錯(cuò)誤消息。 public string ErrorMessage { get;set; } public string ErrorMessageResourceName { get; set; } public Type ErrorMessageResourceType { get; set; } protectedstring ErrorMessageString { get; } public virtual stringFormatErrorMessage(string name); public ValidationResult GetValidationResult(object value, ValidationContextvalidationContext); // // 摘要: // 確定對象的指定值是否有效。 // // 參數(shù): // value: // 要驗(yàn)證的對象的值。 // // 返回結(jié)果: // 如果指定的值有效,則為 true;否則,為 false。 public virtual bool IsValid(object value); protectedvirtual ValidationResultIsValid(object value, ValidationContextvalidationContext); public void Validate(objectvalue, string name); public void Validate(objectvalue, ValidationContext validationContext); }
ValidationAttribute類型就是下面示例中所有應(yīng)用在Model屬性上特性類型的基類,在上面的ValidationAttribute類型中ErrorMessage屬性表示驗(yàn)證錯(cuò)誤所顯示信息,IsValid()方法則是表示驗(yàn)證的值是否通過,下面我們看一下框架給我們提供的Model驗(yàn)證特性類的簡單示例。
首先我們還是使用ASP.NETMVC Model驗(yàn)證(一)中的示例代碼,看一下ViewModel使用了驗(yàn)證特性類后的定義,示例代碼1-2.
代碼1-2
namespace MvcApplication.Models { ///<summary> /// ViewModel-用戶注冊信息 ///</summary> public class RegistrationInformation { [Required] public string ID { get; set; } [Required] public string UserID { get; set; } [Required] [StringLength(10)] public string Password1 { get;set; } [Compare("Password1")] public string Password2 { get;set; } public string Name { get; set; } } }
在代碼1-2中,我們看到了一些應(yīng)用于Model屬性上的特性類,下面簡單的說一下這幾種類型的含義。
Required:[Required],表示此屬性不得為空(包括空字符串),當(dāng)然了也可以通過設(shè)置內(nèi)部的AllowEmptyStrings屬性為true后,則視為可以為空。
StringLength:[StringLength(10)],表示此屬性值的字符串最大長度不能超過10。
Compare:[Compare(“Password1”)],表示此屬性的值必須和指定屬性的值相同,示例中就是Password2的值必須和Password1屬性的值相同,不然就會提示驗(yàn)證的錯(cuò)誤信息
下面來一下項(xiàng)目運(yùn)行后的結(jié)果圖,
圖1
圖1中故意輸入的這些數(shù)值,看下圖2是驗(yàn)證后的結(jié)果
圖2
自定義ValidationAttribute特性類的示例實(shí)現(xiàn)
這一小節(jié)我們直接來看自定義Model驗(yàn)證特性類型,直接來看定義的示例代碼1-3.
代碼1-3
namespace MvcApplication.ModelValidators { [AttributeUsage(AttributeTargets.Property,AllowMultiple=true,Inherited=false)] public class CustomModelValidatorAttribute:ValidationAttribute { public override boolIsValid(object value) { if(string.IsNullOrEmpty((string)value)|| string.Compare((string)value,"jinyuan", true) == 0) { ErrorMessage = "不能為空,或名稱不合法!"; returnfalse; } else { returntrue; } } } }
這里為什么要重寫基類的IsValid()方法,可能MVC框架會調(diào)用這個(gè)方法來判斷當(dāng)前值是否通過驗(yàn)證,這里說一句題外話,在MVC框架中我翻看過默認(rèn)綁定器類型的實(shí)現(xiàn)代碼,并沒有找到對Model驗(yàn)證特性類的調(diào)用,哪位大神知道的話告知一下小弟感激不盡。
現(xiàn)在我們再修改一下代碼1-2中的定義,示例代碼1-4.
代碼1-4
[CustomModelValidator] public string Name { get; set; }
修改過后我們看一下結(jié)果圖3和圖4.
圖3
圖4
看到這里,有點(diǎn)不死心,想模擬實(shí)現(xiàn)一下默認(rèn)綁定器的內(nèi)部實(shí)現(xiàn),這部分內(nèi)容僅供參考,示例代碼1-5.
代碼1-5
public class CustomModelValidatorAttributeModelBinder: DefaultModelBinder { protectedoverride voidSetProperty(ControllerContextcontrollerContext, ModelBindingContextbindingContext, PropertyDescriptorpropertyDescriptor, object value) { base.SetProperty(controllerContext,bindingContext, propertyDescriptor, value); foreach(Attribute att inpropertyDescriptor.Attributes) { if(att is ModelValidators.CustomModelValidatorAttribute) { ModelValidators.CustomModelValidatorAttribute mva = att as ModelValidators.CustomModelValidatorAttribute; if(!mva.IsValid(value)) { bindingContext.ModelState.AddModelError(propertyDescriptor.Name,mva.ErrorMessage); } } } } }
在代碼1-5中我們根據(jù)PropertyDescriptor類型的參數(shù)獲取到應(yīng)用在Model屬性上的所有特性類,然后篩選到我們自定義的類型,進(jìn)行一個(gè)驗(yàn)證判斷然后將其錯(cuò)誤信息添加到ModelState中,需要把我們自定義的這個(gè)Model綁定器注冊到系統(tǒng)中,運(yùn)行的時(shí)候按照圖3的輸入,結(jié)果就跟圖4一樣。同樣的都能實(shí)現(xiàn)功能,這里只是讓大家對默認(rèn)的綁定器營造個(gè)遐想的空間。
免責(zé)聲明:本站發(fā)布的內(nèi)容(圖片、視頻和文字)以原創(chuàng)、轉(zhuǎn)載和分享為主,文章觀點(diǎn)不代表本網(wǎng)站立場,如果涉及侵權(quán)請聯(lián)系站長郵箱:is@yisu.com進(jìn)行舉報(bào),并提供相關(guān)證據(jù),一經(jīng)查實(shí),將立刻刪除涉嫌侵權(quán)內(nèi)容。