Как я могу лучше справиться с этой ситуацией в ASP.NET MVC относительно моих частичных представлений? - PullRequest
3 голосов
/ 22 декабря 2009

У меня есть один вид, который имеет меню с левой стороны и контейнер с правой стороны, который отображается из одного из нескольких частичных видов.

Сейчас я сталкиваюсь с ситуацией, подобной следующему представлению «Индекс»:

<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.

Есть ли что-то, что я могу сделать, чтобы избежать этой ситуации все вместе? Я рассмотрел использование Master View для общих частей, но мне нужно, чтобы он был строго типизированным Master View, что не так просто в ASP.NET MVC.

Спасибо!

Ответы [ 4 ]

2 голосов
/ 22 декабря 2009

Почему бы не использовать отдельные представления для каждого действия с главной страницей, учитывающей все общие биты?

У вас может быть главная страница с заполнителем для каждого раздела.

<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 голос
/ 23 декабря 2009

Вы можете просто написать:

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

но я бы порекомендовал вам передать название всего частичного вида. Мои $ .02.

0 голосов
/ 24 декабря 2009

Вы можете «кодировать по соглашению» и следовать этому шаблону:

<div class="rightHandPane">  
    <% Html.RenderPartialView(Model.CurrentPane + "Partial", Model.SomeData);  %>  
</div>  
0 голосов
/ 22 декабря 2009

Вы можете либо

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); %>
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...