Чем больше я использую ASP.NET MVC, тем больше мне это нравится. Однако в случае отображения данных модели на главных страницах, кажется, есть несколько способов сделать это. Я не уверен относительно лучшего решения.
В качестве примера можно привести коммерческий сайт, на котором я хочу выводить список категорий товаров на каждой странице, а также показывать статус корзины для посетителей.
В веб-формах asp.net я обычно делаю это, используя пользовательские элементы управления, каждый из которых выполняет собственную привязку данных для получения необходимых данных.
В MVC все данные должны передаваться контроллером.
Таким образом, в отношении категорий простейшим решением было бы передать это в Просмотр данных в действии контроллера:
ViewData["Categories"] = _service.GetCategories();
Однако выполнение этого для каждого действия не очень СУХО, поэтому следуя этой статье Я создал базовый контроллер, который добавляет необходимые данные в мои 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"]);
}
А в моей мастер-странице:
<div>
<%this.RenderCategoryList(); %>
</div>
Это кажется довольно чистым подходом. Тем не менее, это лучший способ, так как я также видел предложения по созданию ViewModel для вашей MasterPage. Я мог видеть, что, возможно, по мере роста ваших данных ViewModel это может быть лучшим решением.
Что касается статуса корзины, я полагаю, что сделал бы нечто подобное, но не уверен, будет ли более подходящим RenderAction ( Когда использовать RenderAction против RenderPartial с ASP.NET MVC ).
Спасибо,
Ben