我需要在 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/