ASP.NET MVC Model驗證(三)

ASP.NET MVC Model驗證()

前言

上篇中說到在MVC框架中默認的Model驗證是在哪裏驗證的,還講到DefaultModelBinder類型的內部執行的示意圖,讓你們能夠看到默認的Model驗證是在哪一個具體的方法中來執行的,本篇的主題就是模擬一下默認的實現,自定義個Model綁定器繼承自DefaultModelBinder類型,而且重寫某些個重要的方法。框架

 

Model驗證

  • Model驗證簡單運用示例
  • ModelValidator使用生成過程
  • 自定義實現DefaultModelBinder進行驗證
  • 自定義ModelValidatorProvider 和ModelValidator 
  • ValidationAttribute特性類使用
  • 自定義ValidationAttribute特性類的示例實現

 

自定義實現DefaultModelBinder進行驗證

如下用到的示例正是修改自ASP.NET MVC Model驗證(一)篇幅中的示例,這裏就很少說什麼了,開始直接貼代碼。ide

首先是ViewModel的定義,代碼1-1。spa

代碼1-1code

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:orm

代碼1-2blog

 

   public class ModelValidatorController : Controller

    {

        public ActionResult Index()

        {

            return View(new Models.RegistrationInformation());

        }

        public ActionResult ModelValidator(RegistrationInformation regInfo)

        {

            return View(regInfo);

        }

    }

 

控制器方法對應視圖定義,代碼1-3:繼承

代碼1-3-1ip

Index視圖get

@model MvcApplication.Models.RegistrationInformation

@{

    ViewBag.Title = "Index";

}

<h2>Index</h2>

@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-2input

ModelValidator視圖

@model MvcApplication.Models.RegistrationInformation

@{

    ViewBag.Title = "ModelValidator";

}

<h2>ModelValidator</h2>

@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>

前面所示的就是把示例演示所需的定義好,這個時候運行會發現,只不過是一個頁面傳值而已,什麼都沒有發生。如今咱們來定義一下自定義的Model綁定器繼承自DefaultModelBinder類型。

代碼1-4

public class MyCustomDefaultModelBinder : DefaultModelBinder
    {
        protected override void SetProperty(ControllerContext controllerContext, ModelBindingContext bindingContext, PropertyDescriptor propertyDescriptor, 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;
            }
        }

        protected override void OnModelUpdated(ControllerContext controllerContext, ModelBindingContext bindingContext)
        {
            base.OnModelUpdated(controllerContext, bindingContext);
            Models.RegistrationInformation regInfo = 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類型的集合中遍歷執行的,因此每次進入方法內部的只是個Model屬性,而在SetProperty()方法內部的Model驗證判斷邏輯和ASP.NET MVC Model驗證(一)篇幅的同樣。

而在OnModelUpdated()方法中,咱們首先獲取了示例代碼1-1中定義的ViewModel類型實例,這裏有的朋友可能會問爲何不在SetProperty()方法中也這樣使用,而是使用PropertyDescriptor類型的參數來進行驗證操做,由於在SetProperty()方法執行的期間並無對ViewModel徹底的賦值,因此不能那樣直接獲取實例來使用。接着上面的說,在此以後從當前的綁定上下文的ModelState屬性中獲取判斷密碼1和密碼2是否存在屬性驗證級的錯誤信息,沒有的話將會對它們進行等值驗證,正如上面代碼所示的那樣,隨之驗證Name的時候我將錯誤信息添加的鍵值爲」」,這表示默認爲Model級驗證錯誤信息。

所須要作的驗證都作完了,註冊咱們的自定義綁定器到系統中,在Global.asax文件的Application_Start()中添加代碼1-5.

代碼1-5

ModelBinders.Binders.Add(typeof(Models.RegistrationInformation), new Binders.MyCustomDefaultModelBinder());

最後咱們看一下效果圖,圖1表示爲起初展現的頁面,在我輸入一部分的信息事後,點擊提交事後頁面會跳轉到圖2,而且執行完驗證顯示出驗證後的錯誤信息。

圖1

圖2

你們能夠動手試一試,到這裏說明了一種驗證方式,將在下篇爲你們講解MVC框架提供給咱們的正兒八經用來執行驗證的類型的一些相關類型,以及一些簡單的示例,這樣咱們就不在使用Model綁定器來執行驗證了,看起來綁定器有點遊手好閒。

 

 

做者:金源

出處:http://www.cnblogs.com/jin-yuan/

本文版權歸做者和博客園共有,歡迎轉載,但未經做者贊成必須保留此段聲明,且在文章頁面

相關文章
相關標籤/搜索