如何通过URL获取RouteData?

Ser*_* S. 29 url asp.net-mvc routing url-routing asp.net-mvc-routing

我需要RoutData通过ASP.NET MVC应用程序中的给定URL字符串来获取.

我找到了HttpContextBase基于URL字符串模拟的RouteTable.Routes.GetRouteData()方法,然后将其传递给Route Parsing(Uri to Route)线程中的方法.

如何使用URL字符串模拟HttpContextBase检索?RouteDataRouteTable.Routes.GetRouteData() 或者是否有另一种RouteData通过URL 检索的方法?

Ser*_* S. 40

我使用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 ""; }
            }
        }
    }
}
Run Code Online (Sandbox Code Playgroud)

例如,如果传递〜/ Error/NotFound,则~/Error/NotFound返回类似的内容

var rd = RouteUtils.GetRouteDataByUrl("~/Error/NotFound")
Run Code Online (Sandbox Code Playgroud)

也许这对任何人都有帮助.


小智 7

这适用于我(.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()))));
Run Code Online (Sandbox Code Playgroud)