Вручную инстанцируйте Экземпляра контроллера от произвольного URL?

Мои навыки приводят меня к сбою, и я знаю, что видел код вокруг для этого, но я не могу найти его.

Что самый быстрый путь состоит в том, чтобы взять какой-либо произвольный URL, выполнить его через Ваш asp.net mvc система маршрутизации и выпустить ссылку на экземпляр контроллера на другом конце?

Например, выполнение кода в некотором произвольном методе контроллера. Я хочу сделать что-то вроде этого:

...
string myURL = "http://mysite/mycontroller/myaction/myparameters";

RouteData fakeRouteData = new RouteData(Route???, IRouteHandler???)
RequestContext ctxt = new RequestContext(this.ControllerContext.HttpContext,
                                         fakeRouteData);

ControllerFactory factory = ControllerBuilder.Current.GetControllerFactory();
Controller result = factory.CreateController(ctxt, controllername???)

Я пытаюсь получить экземпляр контроллера точно так же, как система маршрутизации делает, независимо от того, где код выполняется. Я неясен относительно того, как соответствовать частям вместе в этой точке. В то время как я в конечном счете обнаружу его, я думал, что мог сэкономить время путем выяснения здесь;)

14
задан womp 14 January 2010 в 20:16
поделиться

3 ответа

Хм ... Я не знаю, является ли это лучшее решение, потому что это требует издевательства, но, возможно, это поможет. Вы находитесь на правом пути, и заводская часть контроллера прост, как только вы узнаете , что контроллер для создания экземпляра, поэтому вопрос в том, что самый быстрый способ получить RouteTata объект из произвольного ур

И единственный способ, которым я знаю, как было бы так, с MOQ:

string url = "~/Account/LogOn";  //trying to create Account controller in default MVC app

RouteCollection rc = new RouteCollection();
MvcApplication.RegisterRoutes(rc);
System.Web.Routing.RouteData rd = new RouteData();
var mockHttpContext = new Moq.Mock<HttpContextBase>();
var mockRequest = new Moq.Mock<HttpRequestBase>();
mockHttpContext.Setup(x => x.Request).Returns(mockRequest.Object);
mockRequest.Setup(x => x.AppRelativeCurrentExecutionFilePath).Returns(url);

RouteData routeData = rc.GetRouteData(mockHttpContext.Object);

string controllerName = routeData.Values["controller"].ToString();

IControllerFactory factory = ControllerBuilder.Current.GetControllerFactory();
IController controller = factory.CreateController(this.ControllerContext.RequestContext, controllerName);

я сделал довольно гудящую и не мог найти много, что не относится к модульному тестированию / издеванию. Я не знаю, есть ли там , быстро и легко сделать это, но, безусловно, хотел бы знать, если у кого-то есть лучшее решение!

13
ответ дан 1 December 2019 в 12:38
поделиться

Очевидно, вы имеете в виду любую строку URL-доменных URL на сайте MVC, верно? Итак, в http: // yourdomain / что-то / thatsomeone / fire / type / здесь Вы имеете в виду что-то / соотношение / мощь / тип / здесь.

Перейдите в свой файл Global.Asax.ca в методе регистрации Recisteroutes и добавьте что-то вроде следующего:

routes.MapRoute("foo", "foo/bar/in/a/jar", new { controller = "Home", action = "Index", id = "" });

Теперь, когда кто-то типится в http: // yourdoamin / foo / bar / in / a / jar Они будут направлены на действие домой / индекса контроллера.

Надеюсь, что поможет.

Ура, -jc

-1
ответ дан 1 December 2019 в 12:38
поделиться

Ладно, после работы с этим пару недель, вот чем я закончил. Это работает как очарование и избегает зависимости от насмешек, но все равно мне кажется, что мне это не нравится.

// Get the application's route collection.
UrlRoutingModule module = new UrlRoutingModule();
RouteCollection col = module.RouteCollection;

// Fake a request to the supplied URL into the routing system
string originalPath = this.HttpContext.Request.Path;
this.HttpContext.RewritePath(urlToGetControllerFor);
RouteData fakeRouteData = col.GetRouteData(this.HttpContext);

// Get an instance of the controller that would handle this route
string controllername = fakeRouteData.Values["controller"].ToString();
var ctxt = new RequestContext(this.ControllerContext.HttpContext, fakeRouteData);
IController controller = ControllerBuilder.Current.GetControllerFactory()
                          .CreateController(ctxt, controllername);

// Reset our request path.
this.HttpContext.RewritePath(originalPath.ToString());

До сих пор не было абсолютно никаких побочных эффектов звонков RewritePath(). Спасибо Курту за его код, и если кто-нибудь сможет придумать что-нибудь получше, пожалуйста, не стесняйтесь писать.

10
ответ дан 1 December 2019 в 12:38
поделиться
Другие вопросы по тегам:

Похожие вопросы: