RouteValueDictionary的字符串URL

时间:2009-09-26 16:20:54

标签: asp.net-mvc

是否有简单的方法将字符串URL转换为RouteValueDictionary集合?一些方法,如UrlToRouteValueDictionary(string url)

我需要这样的方法,因为我想根据我的路由设置'解析'URL,修改一些路由值,并使用urlHelper.RouteUrl()根据修改后的RouteValueDictionary集合生成字符串URL。

感谢。

4 个答案:

答案 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();
}