Я занимаюсь разработкой своего первого приложения 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
собирать данные и отображать их. Это заставляет меня думать, что я атакую проблему неправильно. Как должен Я решаю это?
UPDATE:
Решение 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
.