Предполагая, что у вас есть доступ к HttpContext (и я полагаю, что вы делаете, поскольку вы просите), вы можете:
var routeData = new RouteData();
// controller and action are compulsory
routeData.Values["action"] = "index";
routeData.Values["controller"] = "foo";
// some additional route parameter
routeData.Values["foo"] = "bar";
IController fooController = new FooController();
var rc = new RequestContext(new HttpContextWrapper(HttpContext), routeData);
fooController.Execute(rc);
Лично я использую этот подход для обработки ошибок внутри моего приложения. Я помещаю это в Application_Error
и выполняю контроллер ошибок для пользовательских страниц ошибок, оставаясь в контексте исходного HTTP-запроса. Вы также можете поместить сложные объекты в хэш routeData
, и вы получите эти сложные объекты обратно в качестве параметров действия. Я использую это для передачи фактического исключения, которое произошло, к действию контроллера ошибок.
UPDATE:
Чтобы проанализировать URL-адрес его токенов данных маршрута с учетом текущих маршрутов, вы можете:
var request = new HttpRequest(null, "http://foo.com/Home/Index", "id=1");
var response = new HttpResponse(new StringWriter());
var httpContext = new HttpContext(request, response);
var routeData = RouteTable.Routes.GetRouteData(new HttpContextWrapper(httpContext));
var values = routeData.Values;
var action = values["action"];
var controller = values["controller"];