ASP.NETMVCアプリケーションで指定されたURL文字列でRoutData
を取得する必要があります。
URL文字列に基づいてHttpContextBase
をモックし、それを Route Parsing(Uri to Route) のRouteTable.Routes.GetRouteData()
メソッドに渡す必要がある方法を見つけました。糸。
RouteTable.Routes.GetRouteData()
?を使用してURL文字列でHttpContextBase
を取得するためにRouteData
をモックする方法URLでRouteData
を取得する別の方法はありますか?
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"
}
これは私にとってはうまくいきます(.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()))));