我們知道,在Asp.Net Mvc Preview5中加入了全新的ModelBinder特性,雖然這個特性非常的強大,但是使用起來並不是那麼的友好,因此,在最新的Asp.Net Mvc Beta中,架構對這部分進行了進一步的加強,使得複雜參數的自動綁定得以實現,本文將分級部分完整探討整個mvc架構中的modelbinder實現和完全挖掘系統內建的ModelBinder的能力,使得基於mvc架構的web開發脫離頁面取值的苦海.
(參見: http://www.cnblogs.com/leven/archive/2008/08/31/1280481.html以及http://www.cnblogs.com/leven/archive/2008/09/01/1280862.html)
首先我們稍微回顧下ModelBinder的使用方法.首先定義一個實體類,然後針對該類寫一個ModelBinder,確定綁定關係,這樣就可以在action的參數中直接使用了.
然而,很多朋友都有體會,這個ModelBinder用起來太過複雜.有沒有更好的解決方案呢?在Asp.Net Mvc beta中,這個答案是肯定的.那就是beta中提供的新特性,自動綁定.
我們知道,在preview5中,系統也能對基本類型以及DateTime和Nullable<DateTime>進行自動綁定,但是對於自訂類是無能為力的.但是想一想,自訂實體類也應該是由一系列簡單類型構成的啊,也就是說,一個複雜的實體類都是有很多簡單類型構成,是不是可以有一個通用的方法來做這個綁定呢?答案是肯定的,其實在我上篇關於preview5綁定的文章例子中就是提供一個相對簡單的通用綁定方案,理所當然的,我們可以擴充這個方案,讓它更加智能化一些,想來Asp.Net MvcTeam Dev也意識到這一點,於是在最新的beta版中,mvc架構就增強了DefaultModelBinder的功能,使得綁定工作儘可能的簡化.
在本篇文章中,我們會探討新的ModelBinder如何使用,且它是如何工作的.
首先,我們用最快的方式進行一次”新版”ModelBinder的實踐,建立一個Mvc工程.設定一個預設的routing.然後開始加入代碼,這個實踐的專案檔如:
工程建立完畢後,我們在NewModelBinderDemo.Library.Entities中加入一個SimpleArticle.cs.這是測試的一個簡單實體,代碼如下:
這是一個沒有加任何修飾的簡單實體.
然後修改BinderController,加入Action,先看看Controller中的全部代碼:
然後是3個aspx頁面.我們看看關鍵的simpletest.aspx
這部分代碼要注意下,標題和本文的表單命名,是article.title和article.content,這是不是有什麼規則了?暫時先不說明.有興趣的朋友可以拿demo研究研究,接下來的部分我們會慢慢研究這兒這樣命名的原因.
至於其他頁面就不再詳細說明其中的代碼了,感興趣的朋友可以下載附帶的demo自行查看.完成上面的一切後,懷著有點忐忑的心情按下Crtl+F5….一步步進行:
Ok.這個頁面沒問題…不過要是這兒也有問題,就說明mvc白學了,囧…
點擊下->
這兒也能進來…不過好像這都不是關鍵.趕緊填點東西..
按下”提交資料”查看結果:
上天作證,我啥事都沒做,居然擷取到article了….太激動了.這意味著我們在mvc架構下開發基本上可以告別繁瑣的頁面參數擷取了,想想p5中讓人無法忍受的modelbinder,beta中的是多麼的和藹可親啊.
先別急著興奮,表單可不止文本域,而且傳遞的參數可不是只有字串.這是肯定的,那麼我們試試繼續考驗下DefaultModelBinder..
添加第二個實體. SimpleArticle,具體代碼如下:
然後對應添加名為AdvanceTest和AdvanceTestResult的action,代碼如下:
對應添加advancetest.aspx和advancetestresult.aspx,樣式和先前一致,此處就不再浪費地方了.
然後我們繼續測試…
填入合適的資料,提交..
非常的神奇,我們仍然什麼都沒做,系統的ModelBinder已經完全識別了AdvanceArticle類並對其下的各種類型的屬性賦值.不過,有的朋友可能擔心了,我們剛才的表單中可是有時間和數字類型,如果使用者不按常理出牌,提交個錯誤的資訊,是否會出錯了?我們可以試試:
繼續提交查看結果:
看上去沒啥問題啊,系統對錯誤的資料採取了使用預設值的方式.但是如果系統給出的預設值和我們需要的不同怎麼辦呢?比如這兒的提交時間…顯然是不滿足我們的要求的.當然是有辦法的,事實上我們只需要在實體的構造方法中對這些屬性設定個初始值就萬事大吉了,系統的ModelBinder探索資料無法填充進去自然會保持原樣.
比如修改下AdvanceArticle類:
這樣之後我們再次提交剛才的表單,結果變化如下:
不錯,自動變成了我們設定的初始值了.該問題解決..
繼續想想,好像目前為止我們都是取的web表單中的文本,其他的表單該怎麼取呢?我們繼續對其他常用表單進行一次測試,為了方便,我們直接修改了AdvanceArticle類來進行測試,修改後的類如下:
這兒自訂了一個enum類型來代表狀態:
我們繼續測試DefaultModelBinder的智商….
填寫表單:
提交查看:
讓人感覺十分驚訝的是,系統居然全部認出了並成功綁定了資料.接下來我們看看更進階的特性,自動綁定數組以及包含類,繼續修改AdvanceArticle:
繼續測試:
提交查看結果…非常棒,系統認出了所有的表單資訊並成功綁定.
本文到此相信大家都對系統的自動參數綁定的威力有了一定的瞭解吧,相信看到如此強大的能力之後你也想將手上的項目升級的Asp.Net Mvc Beta上來脫離取值的苦海吧.
在下一篇中,我們將詳細研究系統這個威力強大的ModelBinder的實現原理,以及對預設綁定的細調設定,更深層次瞭解目前mvc架構中的參數綁定特性,最後附上示範Demo的全部原始碼.
By Leven
2008-10-18
http://files.cnblogs.com/leven/NewModelBinderDemo.rar