如何在ASP.NET MVC中更好地处理有关我的部分视图的这种情况?

时间:2009-12-22 17:57:57

标签: c# asp.net-mvc partial-views

我有一个单独的视图,左侧有一个菜单,右侧有一个容器,可以从多个部分视图中的一个渲染。

现在我遇到了类似以下“索引”视图的情况:

<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中并不那么容易。

谢谢!

4 个答案:

答案 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>