ASP.net MVC: получить «Main-Controller» в RenderAction - PullRequest
6 голосов
/ 15 мая 2009

Как я могу получить фактический «главный контроллер» в RenderAction?

Пример:

MyRoute:

{controller}/{action}

Мой URL может быть: страницы / SomeAction туры / SomeAction ...

На моем Site.Master я делаю RenderAction:

<% Html.RenderAction("Index", "BreadCrumb"); %>

Мое действие BreadCrumbController выглядит следующим образом:

public ActionResult Index(string controller)
{

}

Контроллер строк содержит «BreadCrumb» (что понятно, потому что на самом деле я в BreadCrumbController).

Какой лучший способ получить «настоящий» контроллер (например, страницы или туры).

Ответы [ 3 ]

6 голосов
/ 28 декабря 2009

Родительский вид / контекст контроллера

Если вы используете MVC 2 RC (не знаете о предыдущих выпусках), вы можете получить доступ к родительскому контроллеру через контекст представления, где вы найдете свойство с именем:

ViewContext ParentActionViewContext;

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

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

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

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

    {controller}/{*actions}
    
  2. Создайте собственный класс Route, который будет обрабатывать ваши пользовательские требования к маршруту, и при необходимости заполните RouteData.

второй требует немного больше работы и знаний о маршрутизации, но он поможет вам получить больше знаний о маршрутизации Asp.net MVC. Я делал это в прошлом, и это был ценный урок. А также элегантный способ обработки моих пользовательских требований к маршруту.

2 голосов
/ 18 мая 2009

Не могли бы вы передать его в качестве параметра в контроллер?

- 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
      // ....
 }
0 голосов
/ 15 мая 2009

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

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...