我有一個單一的視圖,其左側有一個菜單,右側有一個容器,它從幾個局部視圖中的一個呈現。如何更好地處理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中並不那麼容易。
謝謝!
好,一些常見的位是動態的。我需要一個強類型的主視圖。如果不創建一些基本控制器,我無法做到這一點,對吧? – KingNestor 2009-12-22 19:37:26
母版頁可以有多個不同的內容佔位符,您可以在其中放置特定區域的內容。 ....我會添加到我的答案。 – Mark 2009-12-22 20:22:49
該模式被稱爲視圖組合,並且是解決此問題的正確方法。將常見的東西分解爲佈局,並使用佈局來定義結構,從必要的部分組成視圖。 – Neal 2009-12-22 20:59:08