原創(chuàng)|其它|編輯:郝浩|2009-09-25 11:12:10.000|閱讀 647 次
概述:本文介紹ASP.NET MVC中的MvcAjaxPanel,MvcAjaxPanel的工作原理與UpdatePanel有頗多相似之處,也做到了一定程度上的透明。
# 界面/圖表報表/文檔/IDE等千款熱門軟控件火熱銷售中 >>
有評論認為,Controller中的邏輯不該根據(jù)一個請求AJAX與否而進行不同處理(Nikhil的解決方案使用RenderPartial 來替代RenderView為AJAX操作進行輸出),因此這個解決方案破壞了MVC的職責。我不這么認為,但是我希望能做到這一點,因為做到這一點即意味著絕對的透明。絕對透明則意味著Controller將一個應(yīng)用程序是否AJAX的決定權(quán)完全交給了客戶端,這點非常理想,因為AJAX完全是一個表現(xiàn)層的概念。ASP.NET AJAX中的UpdatePanel在這方面的表現(xiàn)可圈可點(雖然還遠不夠完美),因此我最后決定也為ASP.NET MVC開發(fā)一款類似UpdatePanel的組件。值得慶幸的是,ASP.NET MVC默認使用WebForm頁面作為視圖模板,在這個強大的模型之下,構(gòu)建出這樣一個AJAX解決方案(的原形)似乎并不十分困難。
我將這個控件命名為MvcAjaxPanel。MvcAjaxPanel與UpdatePanel最大的區(qū)別在于后者接收的是PostBack,而前者接收的只是普通的HTTP請求。Post“Back”意味著Post過后回到了原來的Page,而ASP.NET MVC的請求往往會被引導至不同的頁面。因此如何跨頁面進行內(nèi)容更新是MvcAjaxPanel首要解決的問題。最終我選擇了為每個MvcAjaxPanel指定一個UpdateAreaID的做法。
<mvc:MvcAjaxPanel runat="server" ID="mvcAjaxPanel" UpdateAreaID="Header"> ... </mvc:MvcAjaxPanel> 當頁面向服務(wù)器端發(fā)出一個AJAX請求時將會附帶頁面中的UpdateAreaID信息,而服務(wù)器端的Action并不會意識到這一點,因此依舊按照尋常邏輯指定一個視圖模版并輸出HTML。不過,如果視圖模板中的 MvcAjaxPanel發(fā)現(xiàn)這個請求實際上是一個符合約定的AJAX請求(請注意,只有View組件意識到這是個請求的性質(zhì)),則會使用新的方法來替換標準的輸出。這時候模板就會根據(jù)客戶端傳遞過來的UpdateAreaID,尋找頁面上具有同樣屬性值的MvcAjaxPanel,有選擇性地輸出內(nèi)容。在客戶端就會有對應(yīng)的JavaScript代碼接收服務(wù)器端的數(shù)據(jù),并且更新頁面中的相應(yīng)區(qū)域。
很明顯,MvcAjaxPanel的工作原理與UpdatePanel有頗多相似之處,也做到了一定程度上的透明。而且與Nikhil的解決方案相比,一個非常重要的優(yōu)勢就是可以一次更新頁面中的多個區(qū)域——其實這也就是UpdatePanel的特性之一。而且這種對Controller透明的做法又有一個天然的特點,那就是能夠輕松地在不支持AJAX的瀏覽器中使用傳統(tǒng)的方式切換頁面。
本站文章除注明轉(zhuǎn)載外,均為本站原創(chuàng)或翻譯。歡迎任何形式的轉(zhuǎn)載,但請務(wù)必注明出處、不得修改原文相關(guān)鏈接,如果存在內(nèi)容上的異議請郵件反饋至chenjj@fc6vip.cn
文章轉(zhuǎn)載自:IT專家網(wǎng)