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;

который является контекстом родительского представления, а также имеет ссылку на его контроллер, который инициировал рендеринг представления...

маршрутизация

Мне кажется (из вашего вопроса), что у вас есть запросы с произвольным числом сегментов маршрута... В этом случае у вас есть два варианта:

  1. Определите свой маршрут с жадным параметром где actions в этом случае будут отлавливать все действия в вашем запросе URL

    {controller}/{*actions}
    
  2. Создать кастом 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
      // ....
 }

Что вы имеете в виду под "настоящим" контроллером? Ваше действие указывает на одного контроллера.
Вы имеете в виду предыдущий контроллер? Итак: контроллер, который использовался для визуализации вашего представления, где была создана ваша ссылка, которая указывает на ваш контроллер хлебных крошек?
Если вы не добавите имя этого контроллера в ссылку в качестве параметра, вы не сможете добраться до этого.

Другие вопросы по тегам