Данные главной страницы ASP.NET MVC - PullRequest
4 голосов
/ 22 января 2010

Чем больше я использую ASP.NET MVC, тем больше мне это нравится. Однако в случае отображения данных модели на главных страницах, кажется, есть несколько способов сделать это. Я не уверен относительно лучшего решения.

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

В веб-формах asp.net я обычно делаю это, используя пользовательские элементы управления, каждый из которых выполняет собственную привязку данных для получения необходимых данных.

В MVC все данные должны передаваться контроллером.

Таким образом, в отношении категорий простейшим решением было бы передать это в Просмотр данных в действии контроллера:

ViewData["Categories"] = _service.GetCategories();

Однако выполнение этого для каждого действия не очень СУХО, поэтому следуя этой статье Я создал базовый контроллер, который добавляет необходимые данные в мои ViewData:

    public class AppController : Controller
{
    IAppService _service;

    public AppController() { }
    public AppController(IAppService appService)
    {
        _service = appService;
        SetSiteData();
    }

    private void SetSiteData()
    {
        ViewData["Categories"] = _service.GetCategories();
    }
}

Затем я создал расширение для ViewMasterPage:

        public static void RenderCategoryList(this ViewMasterPage pg) {
        pg.Html.RenderPartial("CategoryList", pg.ViewData["Categories"]);
    }

А в моей мастер-странице:

        <div>
        <%this.RenderCategoryList(); %>
    </div>

Это кажется довольно чистым подходом. Тем не менее, это лучший способ, так как я также видел предложения по созданию ViewModel для вашей MasterPage. Я мог видеть, что, возможно, по мере роста ваших данных ViewModel это может быть лучшим решением.

Что касается статуса корзины, я полагаю, что сделал бы нечто подобное, но не уверен, будет ли более подходящим RenderAction ( Когда использовать RenderAction против RenderPartial с ASP.NET MVC ). Спасибо, Ben

Ответы [ 2 ]

7 голосов
/ 22 января 2010

Это работает, хотя я бы так не поступил по двум причинам:

  1. Мне не нравится вставлять данные в ViewState, так как вы по сути приводите их как объект
  2. Требуя базовый контроллер, вы ограничиваете функциональность контроллерами, которые наследуются от этого базового контроллера (что может и не быть проблемой)

Я думаю, что это будет идеальное использование RenderAction (часть проекта MvcFutures). Этот помощник может быть использован для рендеринга Action на другом контроллере. Таким образом, у вас может быть ProductController с действием ListCategories, вы можете просто сделать что-то вроде:

<% Html.RenderAction<ProductController>(x => x.ListCategories()); %>

ListCategories будет вызывать

_service.GetCategories();

и может вставить информацию в свою собственную модель. Тогда она передаст эту модель в представление, будет частичной страницей.

2 голосов
/ 23 января 2010

Спасибо - RenderAction отлично справился с работой.

Я получил больше информации от здесь .

Итак, для блага других, вот пример того, как я выводю статус корзины:

Действие:

    [ChildActionOnly]
    public ActionResult CartStatus()
    {
        return PartialView(_service.GetCartSummary());
    }

Частичное представление (привязано к Models.Cart)

<div class="cartSummary">
<%if (Model.HasItems) { %>
    Cart Items: <%=Model.Items.Count() %> | Total: <%=Model.TotalItems %>
<%} else {%>
    Your cart is empty. Please buy stuff!
<%} %>

Вспомогательный метод для мастер-страницы:

    public static void RenderCartStatus(this ViewMasterPage pg) {
        pg.Html.RenderAction("CartStatus", "Catalog", null);
    }

И, наконец, главная страница:

<%this.RenderCartStatus(); %>

Спасибо за совет.

...