有没有简单的方法将string URL转换为RouteValueDictionary集合?一些方法,如UrlToRouteValueDictionary(string url)
。
我需要这样的方法,因为我想根据我的路由设置‘解析’URL,修改一些路由值,并根据修改后的RouteValueDictionary集合使用urlHelper.RouteUrl()生成string URL。
谢谢。
发布于 2009-12-02 17:48:13
这里有一个不需要模仿的解决方案:
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"
希望这能有所帮助。
发布于 2009-11-03 23:29:44
您需要创建一个模拟的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
//...
发布于 2017-12-08 17:26:46
我不会依赖前面示例中的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();
}
https://stackoverflow.com/questions/1481565
复制相似问题