web-dev-qa-db-ja.com

URLでRouteDataを取得する方法は?

ASP.NETMVCアプリケーションで指定されたURL文字列でRoutDataを取得する必要があります。

URL文字列に基づいてHttpContextBaseをモックし、それを Route Parsing(Uri to Route)RouteTable.Routes.GetRouteData()メソッドに渡す必要がある方法を見つけました。糸。

RouteTable.Routes.GetRouteData()を使用してURL文字列でHttpContextBaseを取得するためにRouteDataをモックする方法URLでRouteDataを取得する別の方法はありますか?

29
Serge S.

Moq を使用して、HttpContextBaseのどのメンバーがGetRouteData()で使用されているかを判別しました。彼らです:

  • リクエスト
    • AppRelativeCurrentExecutionFilePath
    • PathInfo

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"
}
40
Serge S.

これは私にとってはうまくいきます(.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()))));
7
xrasvo