ASP.NET MVC主页数据

时间:2010-01-22 11:31:05

标签: asp.net-mvc master-pages

我使用ASP.NET MVC越多,我就越喜欢它。但是,在母版页上显示模型数据的情况下,似乎有几种方法可以实现。我不确定最佳解决方案。

我的示例是一个商业网站,我想在每个页面上输出产品类别列表,并显示访问者购物车的状态。

在asp.net Web表单中,我通常会使用用户控件执行此操作,每个用户控件都执行自己的数据绑定以检索所需的数据。

在MVC中,所有数据都应由控制器传递。

关于类别,最简单的解决方案似乎是在控制器操作中的View数据中传递它:

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

但是,对每个操作执行此操作都不是很干,所以在this article之后我创建了一个基本控制器,将所需数据添加到我的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"]);
    }

在我的MasterPage中:

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

这似乎是一种非常干净的方法。但是,这是最好的方法,因为我也看到了为MasterPage创建ViewModel的建议。我可以看到,随着ViewModel数据的增长,这可能是一个更好的解决方案。

关于购物车状态,我想我会做类似的事情但不确定RenderAction是否更合适(When to use RenderAction vs RenderPartial with ASP.NET MVC)。 谢谢, 本

2 个答案:

答案 0 :(得分:7)

这样有效,虽然我不会这样做有两个原因:

  1. 我不喜欢将数据粘贴到ViewState中,因为您基本上将其转换为对象
  2. 通过要求基本控制器,您将功能限制为从此基本控制器继承的控制器(尽管可能不是问题)
  3. 我认为这将完美地使用 RenderAction (MvcFutures项目的一部分)。此帮助程序可用于在另一个控制器上呈现Action。所以你可能有一个带有ListCategories动作的ProductController,你可以这样做:

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

    ListCategories将调用

    _service.GetCategories();
    

    并可能将信息粘贴到自己的模型中。然后它将该模型传递给View将是一个部分页面。

答案 1 :(得分:2)

谢谢 - RenderAction是完美的工作。

我从here获得了更多信息。

因此,为了他人的利益,以下是我输出购物车状态的示例:

动作:

    [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(); %>

感谢您的建议。