Razor _Layout.cshtml общий раздел с определенного контроллера - PullRequest
4 голосов
/ 17 мая 2011

Я занимаюсь разработкой своего первого приложения 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.

1 Ответ

3 голосов
/ 17 мая 2011

Я думаю Html.RenderAction - это то, что вам нужно. С помощью этого метода вы можете создать общий раздел, например, меню.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...