代码之家  ›  专栏  ›  技术社区  ›  Roman

到RouteValueDictionary的字符串URL

  •  18
  • Roman  · 技术社区  · 16 年前

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

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

    谢谢。

    4 回复  |  直到 8 年前
        1
  •  36
  •   Erik Philips Gabriel Costa    11 年前

    以下是不需要模拟的解决方案:

    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"
    

    希望这有帮助。

        2
  •  3
  •   Piotr Czapla    16 年前

    您需要创建一个模拟的httpContext,因为routes约束需要它。

    下面是一个示例,我使用它对我的路由进行单元测试(它是从 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
            //...
    
        3
  •  0
  •   Steve Hiner    10 年前

    这里有一个不需要实例化一堆新类的解决方案。

    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的环境。

        4
  •  0
  •   Serg    8 年前

    我不会依赖前面示例中的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();
    }