2010-01-22 70 views
4

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

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

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

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

所以关于类最简单的办法似乎是通过这个在控制器动作视图数据:

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"]); 
    } 

在我的母版:

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

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

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

回答

7

这样的作品,虽然它不是我会做有两个原因方式:

  1. 我不喜欢粘数据到ViewState的,因为你基本上是强制转换为对象
  2. 通过要求基本控制器你限制功能,从这个basecontroller继承控制器(这可能不是一个虽然问题)

我认为这将是一个完美的使用RenderAction(MvcFutures项目的一部分)。这个帮助器可以用来在另一个控制器上渲染一个Action。所以,你可能有一个ListCategories行动ProductController的,你可能只是这样做:

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

ListCategories会打电话

_service.GetCategories(); 

,并可能粘在信息变成自己的模型。然后它会将该模型传递给View将是一个Partial Page。

+1

对于RenderAction来说,它几乎是一个完美的解决方案,在MVC2发布之后,您可以缓存RenderAction结果,这将是完美的。 – mxmissile 2010-01-22 15:37:01

+0

我是否需要做任何事情来使用上面使用的强类型RenderAction调用?我正在使用mvc 2.0预览,并且似乎无法以这种方式构建RenderAction方法。 – 2010-01-23 09:35:43

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

谢谢你的建议。

+0

试图实现这个解决方案,但我不知道我们在哪里创建辅助方法的母版页?我是否在某处创建另一个c#类文件? – JBeckton 2010-10-11 02:33:45

+0

@JBeckon - 是的,你可以创建一个静态类来包含这些扩展。只要确保在视图或web.config中引用命名空间。 – 2010-10-11 16:20:58