環境:
Windows 2008, VS 2008 SP1, Asp.Net Mvc RC1
------------------------------------------------------------------------------
上文:Asp.Net Mvc: Model Binding 機制分析 中,我們簡單分析了Asp.Net Mvc中Model Binding的過程,非常粗糙,本文將探索如何?一個自己的ModelBinder,並進一步展示前文忽略的若干細節。
假設,我們現在有一個Book類,
現在我們要實現添加Book的功能,因此,建立一個BookController,並且加入一個Action:
建立相應的View:
其實,到這一步,當我們提交表單的時候,在Action裡面已經可以獲得Book自動綁定,這歸功於內建的DefaultModelBinder。但是,我們基於某種考慮,想要使用自己建立的ModelBinder。於是,我們接著建立一個SimpleModelBinder類,該類實現了IModelBinder介面(自訂的ModelBinder必須實現這個介面)。
IModelBinder只有一個方法BindModel(),這個方法接受兩個參數:ControllerContext, ModelBindingContext,因此,我們在實現這個方法的時候,便需要好好利用這兩個參數包含的資訊。
現在來看SimpleModelBinder的具體實現:
上面,我盡量避免寫入程式碼,因為我希望這個SimpleModelBinder具有一定的通用性。此外也避免Model欄位名稱更改的連鎖反應。這裡,我們通過bindingContext.ModelType來建立一個Model執行個體,通過TypeDescriptor來擷取Model的Property集合,通過bindingContext.ValueProvider來取得Request的表單資訊,最後返回一個Model執行個體。
這樣,我們的SimpleModelBinder就建立完了。那麼,如何讓它開始工作呢?
於是就引出一個問題:Asp.Net Mvc如何確定當前需要應用哪個ModelBinder?
答案是:按先後順序:(1)Action方法中Model的參數的Attribute,(2) ModelBinders.Binders字典,(3) Model類的Attribute,(4) DefaultModelBinder
也就是說,我們有(1)(2)(3)三種方法來告訴Asp.Net Mvc當前我們期望應用哪個ModelBinder到哪個Model。
(1) 在Action的Model參數上加Attribute:
(2) 將SimpleModelBinder添加到ModelBinders.Binders字典中:
(3) 在Book類定義時加上Attribute:
好啦,三個方法任由你選擇。
這裡,我們建立了一個很簡單的自訂的ModelBinder,但你是否知道它至少還缺失了一個很重要的功能,就是綁定時對Model的Property的過濾,因為一直以來我都把BindAttribute這個成員給忽視了。下篇,我們就來談談BindAttribute,並對SimpleModelBinder做稍稍的完善。
此外,DefaultModelBinder很強大了,什麼時候需要應用自訂的ModelBinder,則需要在實際項目中慢慢琢磨。
Copyright
作者: Tristan G
本文著作權歸作者和部落格園共有,歡迎轉載