我有一个单独的视图,左侧有一个菜单,右侧有一个容器,可以从多个部分视图中的一个渲染。
现在我遇到了类似以下“索引”视图的情况:
<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真的。
我能做些什么来避免这种情况吗?我考虑过使用Master View作为常见部分,但我需要它是一个强类型的Master View,这在ASP.NET MVC中并不那么容易。
谢谢!
答案 0 :(得分: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>
然后将视图特定内容放在每个内容页面中。
答案 1 :(得分:1)
你可以写一下:
Html.RenderPartialView(string.Format("{0}Partial", Model.CurrentPane), Model.SomeData); %>
但我建议你传递整个部分视图的名称。我的$ .02。
答案 2 :(得分:0)
你可以
a)(如果您正在使用或将要使用的是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); %>
答案 3 :(得分:0)
您可以“按惯例进行编码”并遵循以下模式:
<div class="rightHandPane">
<% Html.RenderPartialView(Model.CurrentPane + "Partial", Model.SomeData); %>
</div>