您好,登錄后才能下訂單哦!
ModelMetadata系列的結束了,從本篇開始就進入Model綁定部分了,這個系列閱讀過后你會對Model綁定有個比較清楚的了解, 本篇對于Model綁定器的最基礎的應用作個簡單的示例展示,目的在于讓大家事先了解一下Model綁定器是什么樣的便于后續篇幅的理解。
IModelBinder、自定義Model綁定器簡單實現
Model綁定器在MVC框架中的位置
MVC中的默認Model綁定器生成過程
IModelBinderProvider的簡單應用
IValueProvider在MVC框架中生成的位置以及過程
IValueProvider的應用場景
IValueProvider的實現之NameValueCollectionValueProvider
Model綁定器在前面的篇幅示例中也有涉及到,在本篇中重新講一下,看過前面篇幅的朋友可以大概的瀏覽一下本篇,然后跳至下一篇了。
對于Model綁定器系統提供了一個默認的綁定器DefaultModelBinder類型,而它實現了IModelBinder接口,我們來看一下IModelBinder接口的定義,代碼1-1.
代碼1-1
public interface IModelBinder { // 摘要: // 使用指定的控制器上下文和綁定上下文將模型綁定到一個值。 // // 參數: // controllerContext: // 控制器上下文。 // // bindingContext: // 綁定上下文。 // // 返回結果: // 綁定值。 object BindModel(ControllerContext controllerContext, ModelBindingContext bindingContext); }
看到代碼1-1中,IModelBinder接口中定義了一個BindModel()方法,并且有兩個參數,通過系統提供給我們的注釋了解到,一個是控制器上下文對象,還有一個是綁定器上下文對象,控制器上下文對象的意思就是在當前控制器所執行范圍內的所有基礎信息都包含在其中,同理綁定上下文也是。后續的篇幅會對這一系列的上下文對象作詳細的介紹,這里就帶過了。
現在我們來實現IModelBinder接口定義個自己的Model綁定器,當然了也可以繼承自DefaultModelBinder類型重寫一下BindModel()方法。我們來看一下我們的自定義實現,代碼1-2.
代碼1-2
using System.Web.Mvc; using ConsoleApplication2; namespace MvcApplication.Binders { public class MyCustomModelBinder:IModelBinder { public object BindModel(ControllerContext controllerContext, ModelBindingContext bindingContext) { return new Customer() { CustomerID = "010", Name = "測試人員", RegistrationDate = DateTime.Now, Address = new Address() { AddressName = "天空之城" } }; } } }
對于ConsoleApplication2命名空間的引用是因為ViewModel被定義在了那里,也就是代碼1-2中BindModel()方法所要返回的類型,在代碼1-2中我們只是簡單的實例化了一個ViewModel(Customer類型),實際可以做的操作非常多。我們再看一下ViewModel的定義,代碼1-3。
代碼1-3
public class Customer { [HiddenInput(DisplayValue=false)] public string CustomerID { get; set; } [Display(Name="姓名")] [UIHint("Password")] public string Name { get; set; } [DataType(DataType.Date)] [Display(Name="注冊日期")] public DateTime RegistrationDate{ get; set; } [UIHint("Address")] public Address Address { get; set; } } public class Address { [Display(Name="地址名稱")] [MyCustomMetadataAware] public string AddressName { get; set; } }
代碼1-3就是ViewModel的定義了,其中包含的一些信息有不清楚的可以在看完本篇后去看ASP.NET MVC Model元數據系列。
現在我們看一下控制器方法的定義,代碼1-4.
代碼1-4
public ViewResult Show(Customer customer) { return View(customer); }
為什么ViewModel要以作為控制器方法參數的方式來進行Model綁定呢?這個疑問在下篇中會解決。
看一下代碼1-5,作為Show方法對應視圖的代碼:
代碼1-5
@model ConsoleApplication2.Customer @{ ViewBag.Title = "Show"; } <h3>Show</h3> <p>@Html.EditorForModel()</p> <p>@Html.EditorFor(m=>Model.Address)</p>
這樣就完成了基礎的工作了,不過還是運行不了,因為我們自定義的Model綁定器還沒有定義到系統中,在項目的Global.asax文件中的MvcApplication類型的Application_Start()方法中添加如代碼1-6。
代碼1-6
ModelBinders.Binders.Add(typeof(Customer), new Binders.MyCustomModelBinder());
當然了也不限于在這里添加,只要在授權過濾器執行之前的任何一個地方都行,因為在授權過濾器執行過后便會對Model綁定器進行生成了,下篇會有講解。在這里添加只不過這里是MVC最先執行的地方。現在我們運行查看結果了。
圖1
免責聲明:本站發布的內容(圖片、視頻和文字)以原創、轉載和分享為主,文章觀點不代表本網站立場,如果涉及侵權請聯系站長郵箱:is@yisu.com進行舉報,并提供相關證據,一經查實,將立刻刪除涉嫌侵權內容。