asp.net-mvc - 如何通过URL获取RouteData?

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

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

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

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

最佳答案

我用了Moq确定 HttpContextBase 的哪些成员在 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"
}

关于asp.net-mvc - 如何通过URL获取RouteData?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/6669563/

相关文章:

asp.net-mvc - 如何在没有web.config设置(customErrors)的情况下使HandleError属性起作用?

c# - asp.net Razor 冒号运算符

java - 列出目录并获取 Java 中每个文件的 URL 的最快可能性

android - 移动网状网络为Android分享互联网连接

c# - Cookie 在浏览器 session 结束时过期

asp.net-mvc - 用于检查整数是否为负值的 DataAnnotation

java - 如何在 JSF 项目中获取文件资源

html - 通过从表单选择选项中选择的按钮按下打开链接

c# - 使用 ASP.NET MVC 进行多参数路由

routing - 如何在Linux IP路由表中查找?