Мне нужно получить RoutData
по заданной строке URL в Приложение ASP.NET MVC.
Я нашел способ имитировать HttpContextBase
на основе моей строки URL, а затем передать его в RouteTable.Routes.GetRouteData ()
в потоке Route Parsing (Uri to Route) .
Как имитировать HttpContextBase
, чтобы получить RouteData
по строке URL, используя RouteTable.Routes. GetRouteData ()
?
Или есть другой способ получить RouteData
по URL-адресу?
Я использовал Moq , чтобы определить, какие элементы HttpContextBase
используются в GetRouteData ()
. Это:
Request.AppRelativeCurrentExecutionFilePath
должен возвращать путь с ~
, что мне точно нужно, поэтому служебный класс может быть таким:
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
):
var rd = RouteUtils.GetRouteDataByUrl("~/Error/NotFound")
Что должно возвращать объект, который выглядит следующим образом:
RouteData.Values
{
controller = "Error",
action = "NotFound"
}