2012-07-25 57 views
2

這是一個架構哲學問題:)從多個控制器的動作輸出構成頁面

您想要創建非常非常簡單的基於模塊化MVC的「CMS」的圖像。事實上,你想要它做的唯一的事情是,你可以指定(XML爲例)每個頁面的結構是這樣的(pseudolang):

 
Use layout: Subpage.cshtml 
For section "Header" (placeholder in layout) render controller "Header", action "SubpageHeader" 
For section "LeftCol" render controller "Menu" action "MainMenu" 
For section "Content" render controller "Articles" action "List" 
etc. 

那麼,什麼是優雅和推薦的方式去做這個?我能想到的2種方式現在:

選項1:

定義自己的路線,這將捕獲所需的網址,並會爲這個請求創建自己的MyMvcHandler。在這個處理程序中,處理不會實例化控制器(沒有一個「主」),而是會讀取「頁面結構配置」(上面的示例),實例化所有需要的控制器..但我不確定,在做什麼這一點 - 如何收集行動的結果,並將其放入佈局?

選項2: 讓默認的MvcHandler存活,並且總是用一些默認操作調用某個「MasterController」,這將只返回View(layoutPage);在佈局頁面中,實現「頁面部分」(內容的佔位符)作爲我自己的幫助器方法,類似於Html.RenderAction - 只能定製爲查看「頁面結構配置」並呈現正確的控制器+操作。但這樣,MasterController似乎對我來說毫無用處,有什麼辦法擺脫他?

你能想出更好的辦法嗎?你能看到一些基本的&這些方法的任何損失?你能指點我一些關於這個問題的好資源嗎? (我找不到任何)。

非常感謝MVC忍者)

+0

假設選項2,您如何計劃從cms解析用戶編寫的語言?你不需要「MasterController」來確保它是可測試的嗎?此外,您的部分是預定義的還是動態的?你可以使用你的MasterController解析出用戶編寫的xml,並用必要的組件填充視圖包?使用依賴注入,你應該能夠實現非常相似的東西。 – parKing 2012-08-28 12:49:59

回答

0

既然你是想不同的控制器和重點是像一個CMS,我建議如下:

  1. 有1個控制器,它處理的主要網址並且用戶可以看到的(如您的選項2)

  2. 每一部分的佈局對Ajax回調獲得HTML的每個部分(標題/菜單/文章/等)

是的,這可以打4個電話,但是折中很好。

例如一些好處:

  1. 每個部分現在可以有獨立的緩存頭。 (例如,佈局可以緩存幾天/周而不是修改)

  2. 每個部分都可以獨立刷新,無需客戶端導航或刷新頁面。

  3. 由於每個部分都是獨立處理的,如果需要,SignalR可用於處理實時更新。

  4. 這些部分(假設他們可能還會進一步劃分)可以跨頁面共享。 (例如,文章可以在多個屏幕上適用的情況下重複使用,...並且也受益於與#1的益處相同的緩存益處)

  5. 如果需要,可以在刷新每個內容片段時通過參數對每個片段進行修改。

  6. 如果需要的話,每個部分/控制器/操作都可以輕鬆操縱返回Json而不是HTML,這樣客戶端就可以增強功能體驗。 (這是假設你沒有做類似淘汰賽的框架做客戶端MVC)

希望這會有所幫助。

0

這當然是可能的,因爲你提到的方法(這是國際海事組織比區間進入更靈活)的:

Html.RenderAction("AnyAction", "AnyController") 

我覺得跟這個概念最大的問題是狀態。如果你走這條路線,並且「AnyController」需要保持狀態,你需要正式確定。否則:誰將對querystring和post變量進行授權?如果發生變量名稱衝突,你會做什麼?

請注意,ASP.NET經典已經以其回髮狀態字段「解決」了這個問題。它爲所有頁面元素分配唯一的ID,並將其放入樹中。最大的缺點是它很快就會變得臃腫和低效,就像ASP.NET經典一樣。

你也可以看看這個問題在其他CMS如何解決,如N2CMS(免責聲明:我沒有什麼其他CMS的經驗)。我認爲它的實現有點類似於你的第二種選擇。您可以在CMS中指定哪些塊進入哪個區域,然後系統會調用所有視圖。不同之處在於,對於子視圖而言,視圖的內容模型是由系統計算出來的,而不是由特定的控制器計算出來的,儘管您可以通過調用RenderAction而不是RenderView來在概念上改變這種情況(不確定實踐中的可行性)。但是在那種情況下,你又在進行狀態討論。

相關問題