我使用 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 )。
谢谢,

最佳答案

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

  • 我不喜欢将数据粘贴到 ViewState 中,因为您本质上将其转换为对象
  • 通过需要一个基本 Controller ,您将功能限制在从该基本 Controller 继承的 Controller 上(尽管这可能不是问题)

  • 我认为这将是 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/

    10-13 08:24
    查看更多