Мои навыки приводят меня к сбою, и я знаю, что видел код вокруг для этого, но я не могу найти его.
Что самый быстрый путь состоит в том, чтобы взять какой-либо произвольный 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???)
Я пытаюсь получить экземпляр контроллера точно так же, как система маршрутизации делает, независимо от того, где код выполняется. Я неясен относительно того, как соответствовать частям вместе в этой точке. В то время как я в конечном счете обнаружу его, я думал, что мог сэкономить время путем выяснения здесь;)
Хм ... Я не знаю, является ли это лучшее решение, потому что это требует издевательства, но, возможно, это поможет. Вы находитесь на правом пути, и заводская часть контроллера прост, как только вы узнаете , что контроллер для создания экземпляра, поэтому вопрос в том, что самый быстрый способ получить 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);
я сделал довольно гудящую и не мог найти много, что не относится к модульному тестированию / издеванию. Я не знаю, есть ли там , быстро и легко сделать это, но, безусловно, хотел бы знать, если у кого-то есть лучшее решение!
Очевидно, вы имеете в виду любую строку 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
Ладно, после работы с этим пару недель, вот чем я закончил. Это работает как очарование и избегает зависимости от насмешек, но все равно мне кажется, что мне это не нравится.
// 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()
. Спасибо Курту за его код, и если кто-нибудь сможет придумать что-нибудь получше, пожалуйста, не стесняйтесь писать.