91超碰碰碰碰久久久久久综合_超碰av人澡人澡人澡人澡人掠_国产黄大片在线观看画质优化_txt小说免费全本

溫馨提示×

溫馨提示×

您好,登錄后才能下訂單哦!

密碼登錄×
登錄注冊×
其他方式登錄
點擊 登錄注冊 即表示同意《億速云用戶服務條款》

ASP.NETMVC Model驗證(三)

發布時間:2020-07-30 03:12:09 來源:網絡 閱讀:974 作者:jinyuan0829 欄目:編程語言

ASP.NETMVC Model驗證()

前言

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

 

Model驗證

  • Model驗證簡單運用示例

  • ModelValidator使用生成過程

  • 自定義實現DefaultModelBinder進行驗證

  • 自定義ModelValidatorProvider ModelValidator 

  • ValidationAttribute特性類使用

  • 自定義ValidationAttribute特性類的示例實現

 

自定義實現DefaultModelBinder進行驗證

以下用到的示例正是修改自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);
        }
    }


控制器方法對應視圖定義,代碼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>

前面所示的就是把示例演示所需的定義好,這個時候運行會發現,只不過是一個頁面傳值而已,什么都沒有發生。現在我們來定義一下自定義的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類型的集合中遍歷執行的,所以每次進入方法內部的只是個Model屬性,而在SetProperty()方法內部的Model驗證判斷邏輯和ASP.NETMVC 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

ASP.NETMVC Model驗證(三)


2

ASP.NETMVC Model驗證(三)


大家可以動手試一試,到這里說明了一種驗證方式,將在下篇為大家講解MVC框架提供給我們的正兒八經用來執行驗證的類型的一些相關類型,以及一些簡單的示例,這樣我們就不在使用Model綁定器來執行驗證了,看起來綁定器有點不務正業。


向AI問一下細節

免責聲明:本站發布的內容(圖片、視頻和文字)以原創、轉載和分享為主,文章觀點不代表本網站立場,如果涉及侵權請聯系站長郵箱:is@yisu.com進行舉報,并提供相關證據,一經查實,將立刻刪除涉嫌侵權內容。

AI

洞头县| 东乌珠穆沁旗| 灵武市| 广饶县| 昂仁县| 华容县| 固阳县| 巴里| 马边| 墨竹工卡县| 千阳县| 宁城县| 西充县| 福建省| 峨边| 晋州市| 罗山县| 岗巴县| 东光县| 修水县| 田东县| 桃江县| 农安县| 龙岩市| 大兴区| 锡林郭勒盟| 四平市| 友谊县| 社会| 额济纳旗| 扬州市| 台东市| 九寨沟县| 沈丘县| 女性| 碌曲县| 新干县| 南皮县| 永嘉县| 长岛县| 岳阳市|