如何通过URL获取RouteData?

30
在ASP.NET MVC应用程序中,我需要通过给定的URL字符串获取RoutData。 我已经找到了一种方法,需要基于我的URL字符串模拟HttpContextBase,然后将其传递给路由解析(Uri to Route)线程中的RouteTable.Routes.GetRouteData()方法。 如何模拟HttpContextBase以使用RouteTable.Routes.GetRouteData()通过URL字符串检索RouteData? 或者是否有另一种通过URL检索RouteData的方法?

https://dev59.com/9moy5IYBdhLWcg3wA5aC - Carter Medlin
2个回答

41

我使用Moq来确定在GetRouteData()中使用了HttpContextBase的哪些成员。它们是:

  • Request
    • 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"
}

1
它对我总是返回 null。 - Bilal Fazlani
这在 QueryString 中存在问题。 - Yitzhak Weinberg

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()))));

那个 StringWriter 需要被处理掉。 - Carter Medlin

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接