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

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

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

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

29
задан Serge S. 23 August 2010 в 14:40
поделиться

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 ):

var rd = RouteUtils.GetRouteDataByUrl("~/Error/NotFound")

Что должно возвращать объект, который выглядит следующим образом:

RouteData.Values
{
    controller = "Error",
    action = "NotFound"
}
40
ответ дан 28 November 2019 в 01:40
поделиться
Другие вопросы по тегам:

Похожие вопросы: