我使用 ASP.NET MVC 越多,我就越喜欢它。但是,在母版页上显示模型数据的情况下,似乎有几种方法。我不确定最佳解决方案。
我的例子是一个商业网站,我想在每个页面上输出一个产品类别列表,并显示访问者购物车的状态。
在asp.net web 表单中,我通常会使用用户控件来执行此操作,每个控件都执行自己的数据绑定(bind)以检索所需的数据。
在 MVC 中,所有数据都应该由 Controller 传递。
因此,关于类别,最简单的解决方案似乎是在 Controller 操作中的 View data 中传递它:
ViewData["Categories"] = _service.GetCategories();
但是,为每个 Action 执行此操作并不是很枯燥,因此在 this article 之后我创建了一个基本 Controller ,将所需的数据添加到我的 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 )。
谢谢,
本
最佳答案
这是有效的,虽然我不会这样做,原因有两个:
我认为这将是 RenderAction (MvcFutures 项目的一部分)的完美使用。此助手可用于在另一个 Controller 上呈现 Action。因此,您可能有一个带有 ListCategories 操作的 ProductController,您可以执行以下操作:
<% Html.RenderAction<ProductController>(x => x.ListCategories()); %>
ListCategories 会调用
_service.GetCategories();
并且可能会将信息粘贴到自己的模型中。然后它将该模型传递给 View 将是一个部分页面。
关于asp.net-mvc - ASP.NET MVC 母版页数据,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/2116882/