2009-12-22 29 views
3

我有一個單一的視圖,其左側有一個菜單,右側有一個容器,它從幾個局部視圖中的一個呈現。如何更好地處理ASP.NET MVC中關於部分視圖的這種情況?

現在我遇到了類似下面的「索引」視圖的情況:

<div class="container"> 
    <div class="leftHandMenu"> 
     // various dynamic menu items 
    </div> 
    <div class="rightHandPane"> 
     <% if (Model.CurrentPane == "Sent") { %> 
      <% Html.RenderPartialView("SentPartial", Model.SomeData); %> 
     <% } else if (Model.CurrentPane == "Inbox") { %> 
      <% Html.RenderPartialView("InboxPartial", Model.SomeData); %> 
     <% } else if (Model.CurrentPane == "Alerts") { %> 
      <% Html.RenderPartialView("AlertsPartial", Model.SomeData); %> 
     <% } %> 
    </div> 
     // various other common view items 
</div> 

與以下操作:

public ActionResult Inbox(int? page) 
{ 
    MessageListViewModel viewData = new MessageListViewModel(); 
    viewData.SomeData = messageService.getInboxMessages(page.HasValue ? page.Value : 0); 
    viewData.CurrentPane = "Inbox"; 
    return View("Index", viewData); 
} 

public ActionResult Alerts(int? page) 
{ 
    MessageListViewModel viewData = new MessageListViewModel(); 
    viewData.SomeData = messageService.getAlertMessages(page.HasValue ? page.Value : 0); 
    viewData.CurrentPane = "Alerts"; 
    return View("Index", viewData); 
} 

public ActionResult Sent(int? page) 
{ 
    MessageListViewModel viewData = new MessageListViewModel(); 
    viewData.SomeData = messageService.getSentMessages(page.HasValue ? page.Value : 0); 
    viewData.CurrentPane = "Sent"; 
    return View("Index", viewData); 
} 

我意識到這種情況並不理想,但我需要這些部分保持部分視圖。我在這個視圖上做了一堆ajax調用,用各種部分視圖重新加載「rightHandPane」。

我有一個單一的視圖「索引」,然後加載一個特定窗格的「索引」這些不同的部分視圖。我將視圖名稱傳遞給ViewModel,然後在適當的局部視圖中加載這些if-else語句。

我還能怎麼做?我即將添加3個部分視圖,這開始是一個痛苦。我寧願如果我不必在我的ViewModel中保持我的currentPane真的。

我能做些什麼來避免這種情況嗎?我已經考慮使用主視圖作爲公共部分,但我需要它是一個強類型的主視圖,這在ASP.NET MVC中並不那麼容易。

謝謝!

回答

2

爲什麼不使用獨立的視圖與服用所有常見位的護理母版頁每個動作?

您可以爲每個部分設置佔位符的母版頁。

<div class="container"> 
    <div class="leftHandMenu"> 
     <asp:ContentPlaceHolder ID="LeftHandMenuContainer" runat="server" /> 
    </div> 
    <div class="rightHandPane"> 
     <asp:ContentPlaceHolder ID="RightHandPaneContainer" runat="server" /> 
    </div> 
     <asp:ContentPlaceHolder ID="FooterContainer" runat="server" /> 
</div> 

然後把視圖具體內容中的每個內容頁面。

+0

好,一些常見的位是動態的。我需要一個強類型的主視圖。如果不創建一些基本控制器,我無法做到這一點,對吧? – KingNestor 2009-12-22 19:37:26

+0

母版頁可以有多個不同的內容佔位符,您可以在其中放置特定區域的內容。 ....我會添加到我的答案。 – Mark 2009-12-22 20:22:49

+0

該模式被稱爲視圖組合,並且是解決此問題的正確方法。將常見的東西分解爲佈局,並使用佈局來定義結構,從必要的部分組成視圖。 – Neal 2009-12-22 20:59:08

0

你既可以

一)(如果您正在使用或將要使用,ASP.NET 4)添加一個調用Html.Action()Html.RenderAction()代替,並讓控制器動作決定渲染的部分。

b)將if語句分解爲單獨的部分或輔助方法。例如:

public static void RenderRightHandPane(this HtmlHelper helper, YourViewModelType model) 
{ 
    switch(model.CurrentPane.ToLower()) 
    { 
     case "sent": 
      helper.RenderPartialView("SentPartial", model.SomeData); 
     case "inbox": 
      helper.RenderPartialView("InboxPartial", model.SomeData); 
     case "alerts": 
      helper.RenderPartialView("AlertsPartial", Model.SomeData); 
     case default: 
      // Add a default handler - perhaps rendering a not found-view...? 
    } 
} 

被稱爲像這樣:

<% Html.RenderRightHandPane(Model); %> 
1

你可以簡單地寫:

Html.RenderPartialView(string.Format("{0}Partial", Model.CurrentPane), Model.SomeData); %> 

但我會建議你通過整個局部視圖的名稱。我的$ .02。

0

你可以「代碼按照慣例」,並按照這個模式:

<div class="rightHandPane"> 
    <% Html.RenderPartialView(Model.CurrentPane + "Partial", Model.SomeData); %> 
</div> 
相關問題