Чем больше я использую ASP.NET MVC, тем больше мне это нравится. Однако в случае показа данных модели на главных страницах существует несколько способов сделать это. Я не уверен в лучшем решении.Данные главной страницы ASP.NET MVC
Мой пример был бы коммерческим сайтом, на котором я хочу вывести список категорий товаров на каждой странице, а также показать статус корзины посетителей.
В веб-формах asp.net я обычно делаю это с помощью пользовательских элементов управления, каждый из которых выполняет свою собственную привязку данных для получения требуемых данных.
В MVC все данные должны передаваться контроллером.
Так, в отношении категорий самое простое решение, казалось бы передать это в виду данных в действии контроллера:
ViewData["Categories"] = _service.GetCategories();
Однако, делая это для каждого действия не очень DRY так следующий this article я создал базовый контроллер, который добавляет необходимые данные в моей 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>
Это кажется довольно чистый подход. Однако, это лучший способ, поскольку я также видел предложения по созданию ViewModel для вашего MasterPage. Я мог видеть, что, возможно, по мере роста ваших данных ViewModel это может быть лучшим решением.
Что касается статуса тележки, я полагаю, что я сделал бы что-то подобное, но не уверен, будет ли RenderAction более подходящим (When to use RenderAction vs RenderPartial with ASP.NET MVC). Спасибо, Бен
+1 для RenderAction, это почти идеальное решение, после выхода MVC2 и вы можете кэшировать результаты RenderAction, это будет идеально. – mxmissile
Нужно ли что-либо делать, чтобы использовать строго типизированный вызов RenderAction, который вы используете выше? Я использую предварительный просмотр mvc 2.0 и, похоже, не могу построить метод RenderAction таким образом. –