2009-02-12 7 views
3

У меня есть метод действия, и в зависимости от того, что ему передается, я хочу перенаправить на другое действие в другом контроллере. Имена действий и контроллеров определяются во время выполнения.В ASP.NET MVC, сохраняйте URL-адрес при возврате RedirectToAction

Если я верну RedirectToAction(), он заставит перенаправить и изменить URL-адрес в браузере. Я бы хотел что-то вроде TransferToAction(), который может перенести обработку текущего запроса на другое действие без переадресации. Кажется, я помню метод, который ведет себя как в предыдущих предпросмотрах, но я не могу найти его в RC ASP.NET MVC.

Вы знаете, как я буду это делать?

UPDATE

Я добавил следующий маршрут:

routes.MapRoute(
    "PageRouter", 
    "{site}/{*url}", 
    new { controller = "PageRouter", 
      action = "RoutePage", site = "", url = "" } 
); 

И в RoutePage PageRouter действия регулятора:

public ActionResult RoutePage(string site, string url) 
{ 
    var controller = new HomeController {ControllerContext = ControllerContext}; 
    controller.RouteData.Values["controller"] = "Home"; 
    controller.RouteData.Values["action"] = "Index"; 

    return controller.Index(site, url); 
} 

Я должен был установить контроллер и действие в RouteData для дома Индекс вид, который будет отображаться. В противном случае он будет искать представление Index в PageRouterController.

Мне все еще нужно выяснить, как создать контроллер и его действие, зная только их имена. например Я хотел бы иметь возможность просто позвонить примерно так:

public ActionResult RoutePage(string site, string url) 
{ 
    return InvokeAction("Home", "Index"); 
} 

Что должно быть в InvokeAction()? Нужно ли мне передавать какой-либо контекст?

ответ

4

Вы должны иметь возможность просто вызвать другой метод напрямую и, если предположить, что он возвращает ViewResult, он отобразит это представление в ответ на запрос, и URL-адрес не изменится. Обратите внимание, что вы будете нести ответственность за то, чтобы все данные, необходимые для этого другого метода, были доступны. Например, если вашему другому методу требуются некоторые параметры формы, которые не были предоставлены, вам может потребоваться создать подходящий FormCollection и установить ValueProvider контроллера на ValueProvider на основе вашего FormCollection. Аналогично с любыми аргументами, требуемыми методом.

+0

Итак, мне нужно использовать отражение, чтобы вызвать метод действия? Я не знаю имя действия или контроллера, к которому я перенаправляюсь, до времени выполнения. –

+0

Также, как насчет контекста контроллера? Этот метод, похоже, не работает для меня. –

+0

Контекст контроллера будет таким же. Что, кажется, не работает? Может быть, вы можете опубликовать код. – tvanfosson