3

我有一个视图,左侧有一个菜单,右侧有一个容器,它是从几个局部视图之一呈现的。

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

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

谢谢!

4

4 回答 4

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>

然后在每个内容页面中放置查看特定内容。

于 2009-12-22T19:26:20.250 回答
1

你可以简单地写:

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

但我建议您传递整个部分视图的名称。我的 .02 美元。

于 2009-12-22T21:12:50.693 回答
0

你也可以

a)(如果您正在使用或将要使用 ASP.NET 4)添加对Html.Action()or的调用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); %>
于 2009-12-22T18:06:31.083 回答
0

您可以“按约定编码”并遵循以下模式:

<div class="rightHandPane">  
    <% Html.RenderPartialView(Model.CurrentPane + "Partial", Model.SomeData);  %>  
</div>  
于 2009-12-24T14:37:02.867 回答