2009-10-20 40 views
3

我只是在觀看Scott Hanselman關於舊金山ASP.NET MVC的演示文稿。在思考了一段時間之後,我很難理解如何最好地構建一個基於ASP.NET MVC的站點,該站點具有[portal | modular | multi-view]結構(選擇您最喜歡的定義)。如何在ASP.NET MVC中構建多視圖門戶應用程序

爲了讓您瞭解我所追求的內容,我公司爲出站客戶端構建了很多門戶樣式的應用程序,這些應用程序包含一個映射模塊,可以響應它自己的查詢字符串和路線,稅務宗地信息模塊同樣有它自己的觀點,顯示單個和多個文檔的文檔檢索視圖......你明白了。關鍵部分是每個模塊都是獨立的。如果用戶按名稱搜索稅收記錄,他們可能會看到10個結果(「JOHN DOE」擁有一些屬性)。每個結果都有一個「映射它」鏈接,因爲網站應用程序框架知道有一個可用的地圖模塊。 「地圖」鏈接發送正確的請求,如http://myapp.com/taxparcel/map/123443。地圖模塊控制器通過縮放到地圖並突出顯示包裹來響應外部請求。

整個流程的關鍵是納稅和映射模塊都在同一個網頁上。

那麼如何適應ASP.NET MVC框呢?諧音?子視圖?單個控制器的多個視圖?如果我只是遺漏了文檔中明顯的部分,請隨時公開聲明我並提供鏈接。否則,我很樂意提供建議。

回答

2

那麼,您的視圖模型需要提供擴展點。我假定數據爲視圖確實包含那些模塊的部分,並且由控制器以某種方式選擇的是:

public ActionResult Search(string text) 
{ 
    var model = seachService.Search(text) 
    // here either: 
    // 1. model contains .Modules collection and is populated by the service, or 
    // 2. controller does 
    var viewmodel = new SearchViewModel(model, modulesService.GetModulesFor(model)); 
    // i.e. it adds modules-specific information to the view data 
    return View(model); 
} 

現在,特定的模塊數據由SearchViewModel轉換成一些視圖可以使用:

public interface IModuleSpecificViewPart 
{ 
    public IList<string> GetAdditionalLinksForUser(); 
    public void RenderAdditionalInfo(Response response); 
} 

和你的觀點並

<%= Model.Results[i] %> 
<% foreach (var module in Model.ModuleSpecific) { %> 
<a href="<%=module.AdditionalLink%>">More</a> 
<% module.RenderAdditionalInfo(Response); %> 
<% } %> 

或模塊的視圖模型可以提供局部視圖名稱等請注意,這是modules.GetModulesFor()和SearchViewModel該做的喬b - 例如,SearchViewModel可以執行IoC.GetInstanceByType(「ModuleViewModel」+ passedModule.GetType()。Name) - 自動獲取特定的模塊視圖模型類。

這是這個想法。這可能是我完全錯誤地理解你的問題 - 對不起,如果是的話。

一個建議,我個人發現,如果我試圖過於通用,它會增加項目的不必要的複雜性(我甚至會爲此添加wrote)。即是的,編譯時你的模塊是未知的,但你必須知道關於它們的一些事情!他們可能會添加鏈接到搜索結果 - 這是擴展點。一個人不能爲「任何事物」描繪延伸點,所以首先你需要列出你的具體情況。

0

我認爲queen3的回覆更適合您的具體問題,但我想我會在一般問題上發表我的想法。

我正在考慮使用Matthew Abbottblogpost中討論的技術做類似的事情。使用MEF,你可以把一個新的DLL放入你的門戶來激活一個模塊。

在單個頁面上有多個模塊是有點竅門。RenderPartial可以工作,但這通常意味着添加可以在相同視圖模型下工作的代碼。 RenderAction另一方面使用自己的控制器和模型。我通常不會在任何其他場景中使用RenderAction,因爲它會中斷或至少會卷積MVC模式。但是,在這種情況下,它只能用於負責佈置多個模塊的單個頁面。所有的插件都可以是常規的MVC視圖,控制器和模型。

有關RenderAction的詳細信息可查詢here

+0

感謝您的補充觀點。沒有簽出MEF是的,但瞭解它如何可以幫助一般。 – Dylan 2010-08-13 21:33:26

相關問題