您好,登錄后才能下訂單哦!
ASP.NETMVC Model驗證(三)
前言
上篇中說到在MVC框架中默認(rèn)的Model驗證是在哪里驗證的,還講到DefaultModelBinder類型的內(nèi)部執(zhí)行的示意圖,讓大家可以看到默認(rèn)的Model驗證是在哪個具體的方法中來執(zhí)行的,本篇的主題就是模擬一下默認(rèn)的實現(xiàn),自定義個Model綁定器繼承自DefaultModelBinder類型,并且重寫某些個重要的方法。
Model驗證
Model驗證簡單運用示例
ModelValidator使用生成過程
自定義實現(xiàn)DefaultModelBinder進(jìn)行驗證
自定義ModelValidatorProvider 和ModelValidator
ValidationAttribute特性類使用
自定義ValidationAttribute特性類的示例實現(xiàn)
自定義實現(xiàn)DefaultModelBinder進(jìn)行驗證
以下用到的示例正是修改自ASP.NET MVC Model驗證(一)篇幅中的示例,這里就不多說什么了,開始直接貼代碼。
首先是ViewModel的定義,代碼1-1。
代碼1-1
namespace MvcApplication.Models { public class RegistrationInformation { public string ID { get; set; } public string UserID { get; set; } public string Password1 { get;set; } public string Password2 { get;set; } public string Name { get; set; } } }
控制器的定義,代碼1-2:
代碼1-2
public class ModelValidatorController: Controller { public ActionResult Index() { returnView(new Models.RegistrationInformation()); } public ActionResult ModelValidator(RegistrationInformation regInfo) { returnView(regInfo); } }
控制器方法對應(yīng)視圖定義,代碼1-3:
代碼1-3-1
Index視圖
@model MvcApplication.Models.RegistrationInformation
@{
ViewBag.Title = "Index";
}
<h3>Index</h3>
@using (Html.BeginForm("ModelValidator","ModelValidator"))
{
<p>用戶注冊ID:@Html.EditorFor(m=>m.ID)</p>
<p>用戶名:@Html.EditorFor(m=>m.UserID)</p>
<p>登錄密碼:@Html.EditorFor(m=>m.Password1)</p>
<p>再次輸入域密碼:@Html.EditorFor(m=>m.Password2)</p>
<p>姓名:@Html.EditorFor(m=>m.Name)</p>
<input type="submit" value="提交" />
}
代碼1-3-2
ModelValidator視圖
@model MvcApplication.Models.RegistrationInformation
@{
ViewBag.Title = "ModelValidator";
}
<h3>ModelValidator</h3>
@Html.ValidationSummary(true)
<p>用戶注冊ID:@Html.EditorFor(m => m.ID)
@Html.ValidationMessageFor(m=>m.ID)
</p>
<p>用戶名:@Html.EditorFor(m => m.UserID)
@Html.ValidationMessageFor(m=>m.UserID)</p>
<p>登錄密碼:@Html.EditorFor(m => m.Password1)
@Html.ValidationMessageFor(m=>m.Password1)
</p>
<p>再次輸入域密碼:@Html.EditorFor(m => m.Password2)
@Html.ValidationMessageFor(m=>m.Password2)
</p>
<p>姓名:@Html.EditorFor(m=>m.Name)</p>
前面所示的就是把示例演示所需的定義好,這個時候運行會發(fā)現(xiàn),只不過是一個頁面?zhèn)髦刀?,什么都沒有發(fā)生?,F(xiàn)在我們來定義一下自定義的Model綁定器繼承自DefaultModelBinder類型。
代碼1-4
public class MyCustomDefaultModelBinder: DefaultModelBinder { protectedoverride voidSetProperty(ControllerContextcontrollerContext, ModelBindingContextbindingContext, PropertyDescriptorpropertyDescriptor, object value) { base.SetProperty(controllerContext,bindingContext, propertyDescriptor, value); switch(propertyDescriptor.Name) { case"ID": if(string.IsNullOrEmpty((string)value)|| (string)value == "") { bindingContext.ModelState.AddModelError("ID","請輸入ID,ID不能為空!"); } break; case"UserID": if(string.IsNullOrEmpty((string)value)|| (string)value == "") { bindingContext.ModelState.AddModelError("UserID","請輸入用戶賬戶,用戶賬戶不能為空!"); } break; case"Password1": if(string.IsNullOrEmpty((string)value)|| (string)value == "") { bindingContext.ModelState.AddModelError("Password1","請輸入登錄密碼,登錄密碼不能為空!"); } break; case"Password2": if(string.IsNullOrEmpty((string)value)|| (string)value == "") { bindingContext.ModelState.AddModelError("Pssword2", "請再次輸入密碼,密碼不能為空!"); } break; case"Name": break; } } protectedoverride voidOnModelUpdated(ControllerContextcontrollerContext, ModelBindingContextbindingContext) { base.OnModelUpdated(controllerContext,bindingContext); Models.RegistrationInformationregInfo = bindingContext.Model as Models.RegistrationInformation; if(bindingContext.ModelState["Password1"].Errors.Count== 0 && bindingContext.ModelState["Password2"].Errors.Count== 0) { if(regInfo.Password1 != regInfo.Password2) { bindingContext.ModelState.AddModelError("Password2","請重新輸入密碼,與上次輸入密碼不同"); } } if(string.Compare(regInfo.Name, "jinyuan", true)==0) { bindingContext.ModelState.AddModelError("","您輸入的名稱違法了,立即更改不然查水表"); } } }
代碼1-4中,我們重寫了SetProperty()方法,從上篇的知識中得知,這個方法是在PropertyDescriptor類型的集合中遍歷執(zhí)行的,所以每次進(jìn)入方法內(nèi)部的只是個Model屬性,而在SetProperty()方法內(nèi)部的Model驗證判斷邏輯和ASP.NETMVC Model驗證(一)篇幅的一樣。
而在OnModelUpdated()方法中,我們首先獲取了示例代碼1-1中定義的ViewModel類型實例,這里有的朋友可能會問為什么不在SetProperty()方法中也這樣使用,而是使用PropertyDescriptor類型的參數(shù)來進(jìn)行驗證操作,因為在SetProperty()方法執(zhí)行的期間并沒有對ViewModel完全的賦值,所以不能那樣直接獲取實例來使用。接著上面的說,在此之后從當(dāng)前的綁定上下文的ModelState屬性中獲取判斷密碼1和密碼2是否存在屬性驗證級的錯誤信息,沒有的話將會對它們進(jìn)行等值驗證,正如上面代碼所示的那樣,隨之驗證Name的時候我將錯誤信息添加的鍵值為””,這表示默認(rèn)為Model級驗證錯誤信息。
所需要做的驗證都做完了,注冊我們的自定義綁定器到系統(tǒng)中,在Global.asax文件的Application_Start()中添加代碼1-5.
代碼1-5
ModelBinders.Binders.Add(typeof(Models.RegistrationInformation),new Binders.MyCustomDefaultModelBinder());
最后我們看一下效果圖,圖1表示為起初展示的頁面,在我輸入一部分的信息過后,點擊提交過后頁面會跳轉(zhuǎn)到圖2,并且執(zhí)行完驗證顯示出驗證后的錯誤信息。
圖1
圖2
大家可以動手試一試,到這里說明了一種驗證方式,將在下篇為大家講解MVC框架提供給我們的正兒八經(jīng)用來執(zhí)行驗證的類型的一些相關(guān)類型,以及一些簡單的示例,這樣我們就不在使用Model綁定器來執(zhí)行驗證了,看起來綁定器有點不務(wù)正業(yè)。
免責(zé)聲明:本站發(fā)布的內(nèi)容(圖片、視頻和文字)以原創(chuàng)、轉(zhuǎn)載和分享為主,文章觀點不代表本網(wǎng)站立場,如果涉及侵權(quán)請聯(lián)系站長郵箱:is@yisu.com進(jìn)行舉報,并提供相關(guān)證據(jù),一經(jīng)查實,將立刻刪除涉嫌侵權(quán)內(nèi)容。