В ASP.NET MVC сохраняйте URL при возврате RedirectToAction - PullRequest
3 голосов
/ 13 февраля 2009

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

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

Вы знаете, как я это сделаю?

UPDATE

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

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

И действие контроллера PageRouter RoutePage:

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 для представления Home Index, которое будет отображаться. В противном случае он будет искать представление индекса в PageRouterController.

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

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

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

1 Ответ

4 голосов
/ 13 февраля 2009

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

...