【发布时间】:2011-05-17 13:39:49
【问题描述】:
我正在开发我的第一个 ASP.NET MVC 应用程序,我想要完成的是在每个页面的一个部分中显示一个通用列表。在我的例子中,我有一个 _Layout.cshtml,它有一个页眉、页脚、主区域和一个左侧边栏,我希望始终在其中显示从数据库中检索到的项目列表。
如果我这样做:
@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>
然后我在名为 _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。
【问题讨论】: