2009-09-26 32 views
18

是否有將字符串URL轉換爲RouteValueDictionary集合的簡單方法?一些方法,如UrlToRouteValueDictionary(string url)字符串URL到RouteValueDictionary

我需要這樣的方法,因爲我想根據我的路由設置'解析'URL,修改一些路由值並使用urlHelper.RouteUrl()根據修改的RouteValueDictionary集合生成字符串URL。

謝謝。

回答

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" 

希望這有助於。

+0

Piotr,非常感謝你的幫助。這個解決方案看起來不錯 – Roman 2009-12-02 21:44:08

+2

有人已經寫過這樣的:[從URL創建一個RouteData實例](http://www.scottschluer.com/creating-a-routedata-instance-from-a-url/) – 2012-07-23 18:41:39

+0

@ david.s我遇到了您發佈的解決方案問題。它無法從查詢字符串中分離路由值。 Piotr的解決方案正常工作。 – 2013-09-11 08:12:53

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 
     //... 
+0

謝謝,這個解決方案看起來很有趣。但可惜沒有「輕量級」的方法,不需要嘲笑,因爲我在單元測試中使用了Mocks,而不是一般的代碼。看起來我應該。 – Roman 2009-11-04 11:02:14

+0

我有類似的問題,最後決定在請求之間傳遞序列化的RouteCollection。 – 2009-11-05 15:36:29

+0

完美。非常感謝。 – 2011-11-09 05:55:20

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

+0

你能解釋一下你的owin環境嗎?如果我們引用Microsoft.Owin庫,你是否在說你的代碼片段? – bkwdesign 2015-12-21 21:27:48

+0

我在使用OWIN的MVC項目中運行上面的代碼。 MVC 5使用OWIN,但早期版本沒有。如果您使用的是MVC 5或更高版本,則不需要添加任何引用。 – 2015-12-22 22:30:39

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