Как получить RouteData по URL?
Мне нужно получить RoutData
по заданной строке URL в приложении ASP.NET MVC.
Я нашел способ, которым я должен издеваться над HttpContextBase
на основе моей строки URL, а затем передать его RouteTable.Routes.GetRouteData()
в RouteTable.Routes.GetRouteData()
Route Parsing (Uri to Route) .
Как издеваться над HttpContextBase
для получения RouteData
по URL-адресу с помощью RouteTable.Routes.GetRouteData()
? Или есть другой способ получить URL-адрес RouteData
по URL-адресу?
- Rails: перенаправить все неизвестные маршруты в root_url
- Перенаправление URL-адреса ASP.NET
- Как изменить маршрут до имени пользователя после входа в систему?
- ASP.NET MVC Url Route поддерживает (точка)
- Получение полного URL-адреса действия в ASP.NET MVC
- Несколько уровней в пользовательской маршрутизации MVC
- Изменение базового URL-адреса для разработки Rails 3
- Приоритет параметров маршрутизации MVC
- Пользовательская маршрутизация ASP.NET MVC для поиска
- Добавить конечную косую черту в конце каждого URL-адреса?
- Использование маршрутизации ASP.NET для обслуживания статических файлов
- url с несколькими косыми чертами, что-то сломает?
- Зачем создавать специальные маршруты перед обычными маршрутами в asp.net mvc?
Я использовал Moq для определения того, какие элементы HttpContextBase
используются в GetRouteData()
. Они есть:
- Запрос
- AppRelativeCurrentExecutionFilePath
- PathInfo
Request.AppRelativeCurrentExecutionFilePath
должен возвращать путь с ~
, что мне точно нужно, поэтому class утилиты может быть таким:
public static class RouteUtils { public static RouteData GetRouteDataByUrl(string url) { return RouteTable.Routes.GetRouteData(new RewritedHttpContextBase(url)); } private class RewritedHttpContextBase : HttpContextBase { private readonly HttpRequestBase mockHttpRequestBase; public RewritedHttpContextBase(string appRelativeUrl) { this.mockHttpRequestBase = new MockHttpRequestBase(appRelativeUrl); } public override HttpRequestBase Request { get { return mockHttpRequestBase; } } private class MockHttpRequestBase : HttpRequestBase { private readonly string appRelativeUrl; public MockHttpRequestBase(string appRelativeUrl) { this.appRelativeUrl = appRelativeUrl; } public override string AppRelativeCurrentExecutionFilePath { get { return appRelativeUrl; } } public override string PathInfo { get { return ""; } } } } }
Если вы передаете ~ / Error / NotFound , например, RouteUtils.GetRouteByUrl("~/Error/NotFound")
возвращает что-то вроде
RouteData.Values { controller = "Error", action = "NotFound" }
Возможно, это будет полезно для всех.
Это работает для меня (.NET 4.5, MVC 5): https://average-joe.info/url-to-route-data/
System.Web.Routing.RouteData routeFromUrl = System.Web.Routing.RouteTable.Routes.GetRouteData( new HttpContextWrapper( new HttpContext( new HttpRequest(null, path, query), new HttpResponse(new System.IO.StringWriter()))));