是否有简单的方法将字符串URL转换为RouteValueDictionary集合?一些方法,如UrlToRouteValueDictionary(string url)
。
我需要这样的方法,因为我想根据我的路由设置'解析'URL,修改一些路由值,并使用urlHelper.RouteUrl()根据修改后的RouteValueDictionary集合生成字符串URL。
感谢。
答案 0 :(得分:36)
这是一个不需要模拟的解决方案:
var request = new HttpRequest(null, "http://localhost:3333/Home/About", "testvalue=1");
var response = new HttpResponse(new StringWriter());
var httpContext = new HttpContext(request, response);
var routeData = RouteTable.Routes.GetRouteData(new HttpContextWrapper(httpContext));
var values = routeData.Values;
// The following should be true for initial version of mvc app.
values["controller"] == "Home"
values["action"] == "Index"
希望这有帮助。
答案 1 :(得分:3)
您需要创建一个模拟的HttpContext,因为路径约束需要它。
以下是我用来对我的路线进行单元测试的示例(它是从Pro ASP.Net MVC framework复制而来的):
RouteCollection routeConfig = new RouteCollection();
MvcApplication.RegisterRoutes(routeConfig);
var mockHttpContext = new MockedHttpContext(url);
RouteData routeData = routeConfig.GetRouteData(mockHttpContext.Object);
// routeData.Values is an instance of RouteValueDictionary
//...
答案 2 :(得分:0)
这是一个不需要实例化一堆新类的解决方案。
var httpContext = context.Get<System.Web.HttpContextWrapper>("System.Web.HttpContextBase");
var routeData = System.Web.Routing.RouteTable.Routes.GetRouteData(httpContext);
var values = routeData.Values;
var controller = values["controller"];
var action = values["action"];
owin上下文包含一个包含HttpContext的环境。
答案 3 :(得分:0)
我不会依赖前面示例中的RouteTable.Routes.GetRouteData,因为在这种情况下,您可能会遗漏某些值(例如,如果您的查询字符串参数不完全适合任何已注册的映射路径)。此外,我的版本不需要模拟一堆请求/响应/上下文对象。
public static RouteValueDictionary UrlToRouteValueDictionary(string url)
{
int queryPos = url.IndexOf('?');
if (queryPos != -1)
{
string queryString = url.Substring(queryPos + 1);
var valuesCollection = HttpUtility.ParseQueryString(queryString);
return new RouteValueDictionary(valuesCollection.AllKeys.ToDictionary(k => k, k => (object)valuesCollection[k]));
}
return new RouteValueDictionary();
}