Razor _Layout.cshtml来自特定控制器的常见部分

时间:2011-05-17 13:39:50

标签: asp.net-mvc asp.net-mvc-3

我正在开发我的第一个ASP.NET MVC应用程序,我想要完成的是在每个页面的一个部分中显示一个公共列表。在我的例子中,我有一个_Layout.cshtml,它有一个页眉,页脚,主区域和一个左侧边栏,我希望始终显示从DB中检索的项目列表。

如果我这样做:

@RenderSection("BestSellingFlavors")

在_Layout.cshtml中,我可以让任何特定的视图在那里显示其“BestSellingFlavors”部分,但在我的情况下,这是从数据库中检索的标准列表 - 我希望它始终显示在侧边栏上,无论哪个用户正在查看的页面。有意义吗?

目前,我有一个控制器/模型/视图,提供了我们库存中最畅销的口味的视图,但我不知道如何在不重复每个控制器中的一堆代码的情况下检索和显示该信息图。

一个想法是BaseController处理检索最畅销的产品。像这样:

public abstract class BaseController : Controller
{
   public PartialViewResult BestSellers()
   {
      try
      {
         var db = IceCreamDBData();
         var all = db.Sales.AsEnumerable();
         var bestsellers = from a in all select new {a.Name, a.UnitsSold};
         return PartialView("BestSellers", bestsellers);
      }
      catch (Exception)
      {
          throw;
      }
   }
}

我的各种控制器将继承BaseController。 但后来我不禁想知道这实际上是如何被调用的,以及视图代码所在的位置,@foreach该数据集合并显示它。这让我觉得我“错误地攻击了这个问题。应该如何解决这个问题


更新 J.W.的解决方案和链接让我开始了,现在我(大概)正走在正确的轨道上。

在我的_Layout.cshtml中,我创建了一个div:

<div id="BestSellers">
   @Html.Action("BestSellers")
</div>

然后我在Shared文件夹中创建了一个名为_BestSellersPartial.cshtml的局部视图,其中包含以下内容:

@model HometownIceCream.Models.BestSellersViewModel
<h3>Best Sellers</h3>
@foreach (var item in Model.Entries)
{
   <div>@item.Name</div>
}

然后我的BaseController看起来像这样:

public abstract class BaseController : Controller
{
   public PartialViewResult BestSellers()
   {
      try
      {
         var db = IceCreamDBData();
         var all = db.Sales.AsEnumerable();
         var bestsellers = from a in all select new {a.Name, a.UnitsSold};
         BestSellersViewModel mod = new BestSellersViewModel() {Entries = bestsellers};
         return PartialView("_BestSellersPartial", mod);
      }
      catch (Exception)
      {
          throw;
      }
   }
}

这看起来效果很好。我需要为控制器做的唯一事情是让他们继承BaseController而不是Controller

1 个答案:

答案 0 :(得分:3)

我认为Html.RenderAction就是你所需要的。您可以使用此方法创建共享部分,例如菜单。