【问题标题】:How to get RouteData by URL?如何通过 URL 获取 RouteData?
【发布时间】:2011-04-02 12:08:31
【问题描述】:

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

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

如何模拟 HttpContextBase 以使用 RouteTable.Routes.GetRouteData() 通过 URL 字符串检索 RouteData 或者还有其他方法可以通过 URL 检索RouteData

【问题讨论】:

标签: asp.net-mvc url routing url-routing asp.net-mvc-routing


【解决方案1】:

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

  • 请求
    • AppRelativeCurrentExecutionFilePath
    • 路径信息

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

【讨论】:

  • 对我来说总是无效
  • QueryString 有问题
【解决方案2】:

这对我有用(.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需要被处理掉。
猜你喜欢
  • 2016-11-25
  • 2019-02-02
  • 2013-04-20
  • 2011-04-26
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多