Подтвердить что ты не робот

Как получить RouteData по URL?

Мне нужно получить RoutData по заданной строке URL в приложении ASP.NET MVC.

Я нашел способ, которым мне нужно mock HttpContextBase на основе моей строки URL, а затем передать его методу RouteTable.Routes.GetRouteData() в Маршрутизация (Parsing) Uri to Route).

Как высмеивать HttpContextBase для извлечения RouteData по строке URL с помощью RouteTable.Routes.GetRouteData()? Или есть другой способ получить RouteData по URL?

4b9b3361

Ответ 1

Я использовал 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, например, RouteUtils.GetRouteByUrl("~/Error/NotFound") возвращает что-то вроде

RouteData.Values
{
    controller = "Error",
    action = "NotFound"
}

Возможно, это будет полезно для всех.

Ответ 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()))));