Кто-либо может уточнить то, почему Вы определили бы ViewData["MenuData"] на каждом действии для чего-то как динамическое меню?
У меня есть простое частичное представление, которое представляет меню, я представляю это меню из основной страницы. Это - intutive для меня прибывающий из ASP.NET WebForms, но единственный путь ко мне для заполнения меню состоит в том, чтобы передать ViewData["MenuData"], но затем я должен сделать это в каждом действии контроллера. Это действительно чувствует себя немного глупым, что я должен был бы определить эти данные представления каждый раз.
С точки зрения тестируемости и что такое MVC-выход ASP.NET, как я должен приблизиться к этому?
Другой вариант - использовать метод RenderAction
вместо этого, который вызовет действие (либо на текущем контроллере, либо, если вы предоставите имя контроллера, на этом контроллере), которое может построить данные меню для вас и вызвать ваше частичное представление ascx:
Таким образом, на моей главной странице я могу иметь:
<% Html.RenderAction("MenuArchiveList"); %>
Затем в моем контроллере:
public ActionResult MenuArchiveList() {
return PartialView("BlogArchiveList",
_BlogRepository.GetArchiveYearPostCounts());
}
Это успешно находит пользовательский элемент управления \Views\Shared\BlogArchiveList. ascx
Если вы хотите гарантировать, что ваше действие будет вызываться только в контексте частичного представления, то вы должны украсить его атрибутом ChildActionOnlyAttribute
.
Он был добавлен в System.Web.Mvc в версии 2 из пространства имен "futures" Microsoft.Web.Mvc.
Вы должны использовать базовый контроллер, который обрабатывает повторное наполнение вашей модели представления, а затем все ваши контроллеры должны быть производными от него
см. здесь ViewModel Best Practices