我使用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)。 谢谢, 本
答案 0 :(得分:7)
这样有效,虽然我不会这样做有两个原因:
我认为这将完美地使用 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(); %>
感谢您的建议。