ASP.net MVC: получить "Main-Controller" в RenderAction
Как я могу получить фактический "главный контроллер" в RenderAction?
Пример:
MyRoute:
{controller}/{action}
Мой URL может быть: страницы / Someaction туры / Someaction...
В моем Site.Master я делаю RenderAction:
<% Html.RenderAction("Index", "BreadCrumb"); %>
Мое действие BreadCrumbController выглядит так:
public ActionResult Index(string controller)
{
}
Контроллер строк содержит "BreadCrumb" (что понятно, потому что на самом деле я нахожусь в BreadCrumbController).
Какой самый лучший способ получить "настоящий" контроллер (например, страницы или туры).
3 ответа
Родительский вид / контекст контроллера
Если вы используете MVC 2 RC (не знаете о предыдущих выпусках), вы можете добраться до родительского контроллера через контекст представления, где вы найдете свойство с именем:
ViewContext ParentActionViewContext;
который является контекстом родительского представления, а также имеет ссылку на его контроллер, который инициировал рендеринг представления...
маршрутизация
Мне кажется (из вашего вопроса), что у вас есть запросы с произвольным числом сегментов маршрута... В этом случае у вас есть два варианта:
Определите свой маршрут с жадным параметром где
actions
в этом случае будут отлавливать все действия в вашем запросе URL{controller}/{*actions}
Создать кастом
Route
класс, который будет обрабатывать ваши собственные требования маршрута и заполнятьRouteData
по мере необходимости.
Второй требует немного больше работы и знаний о маршрутизации, но он поможет вам получить больше знаний о маршрутизации Asp.net MVC. Я делал это в прошлом, и это был ценный урок. А также элегантный способ обработки моих пользовательских требований к маршруту.
Не могли бы вы передать его в качестве параметра в контроллер?
--Site.master--
<% Html.RenderAction("Index", "BreadCrumb"
new { controller = ViewData["controller"] }); %>
--BreadCrumbController.cs--
public ActionResult Index(string controller)
{
}
--ToursController.cs--
public ActionResult SomeAction(...)
{
// ....
ViewData["controller"] = "Tours"
// You could parse the Controller type name from:
// this.ControllerContext.Controller.GetType().Name
// ....
}
Что вы имеете в виду под "настоящим" контроллером? Ваше действие указывает на одного контроллера.
Вы имеете в виду предыдущий контроллер? Итак: контроллер, который использовался для визуализации вашего представления, где была создана ваша ссылка, которая указывает на ваш контроллер хлебных крошек?
Если вы не добавите имя этого контроллера в ссылку в качестве параметра, вы не сможете добраться до этого.