2011-04-28 85 views
32

我使用該方法構建的url:如何將Request.QueryString傳遞給Url.Action?

Url.Action("action", "controller"); 

我喜歡通過查詢字符串爲當前請求到該URL爲好。 類似以下(但不工作):

Url.Action("action", "controller", Request.QueryString); 

轉換的查詢字符串來routevalues可能有以下擴展名:

public static RouteValueDictionary ToRouteValues(this NameValueCollection queryString) 
    { 
     if (queryString.IsNull() || queryString.HasKeys() == false) return new RouteValueDictionary(); 

     var routeValues = new RouteValueDictionary(); 
     foreach (string key in queryString.AllKeys) 
      routeValues.Add(key, queryString[key]); 

     return routeValues; 
    } 

用下面的擴展方法做的工作:

Url.Action("action", "controller", Request.QueryString.ToRouteValues()); 

還有其他更好的方法嗎? Thx

+0

如果查詢字符串包含具有相同鍵的兩個鍵/值,則會引發異常,這總是一種可能性,因爲某人可以在瀏覽器中更改查詢字符串 – 2012-08-01 18:07:33

+3

謝謝,這個問題是一個非常有用的答案!什麼是'querystring.IsNull()'雖然?這是一個自定義的擴展嗎?因爲我沒有看到它。 – hofnarwillie 2012-09-13 18:09:17

回答

13

該擴展方法似乎是正確的,是要走的路。

30

如果你想能夠輕鬆地添加額外的路線值參數,您Url.Action,試試這個擴展方法(基於換行的),這需要一個匿名對象,並返回一個RouteValueCollection:

public static RouteValueDictionary ToRouteValues(this NameValueCollection col, Object obj) 
{ 
    var values = new RouteValueDictionary(obj); 
    if (col != null) 
    { 
     foreach (string key in col) 
     { 
      //values passed in object override those already in collection 
      if (key != null && !values.ContainsKey(key)) values[key] = col[key]; 
     } 
    } 
    return values; 
} 

然後你可以這樣使用它:

Url.Action("action", "controller", Request.QueryString.ToRouteValues(new{ id=0 })); 
+1

+1我把這個添加到我的工具類 – shashwat 2013-09-07 09:34:32

+1

第一行可以縮寫爲'var values = new RouteValueDictionary(obj);'。由於'RouteValueDictionary(object)'接受空值(它實例化一個空字典),因此三元不是必需的。 – 2013-12-04 18:53:35

0

這是我的解決方案基於pwhe23的答案。 我想通過POST請求保留查詢字符串參數(由於Mvc.Grid),並且只對HTTP GET使用單個操作。 CRUD操作由單個頁面和內部的模態對話框處理(用於插入/更新/刪除)。

因此,這裏是我的擴展:在控制器(例如編輯動作)

public static class MvcExtensions 
{ 
    public static RouteValueDictionary ToRouteValues(this NameValueCollection col, Object obj = null) 
    { 
     var values = obj != null ? new RouteValueDictionary(obj) : new RouteValueDictionary(); 

     if (col == null) return values; 

     foreach (string key in col) 
     { 
      //values passed in object are already in collection 
      if (!values.ContainsKey(key)) values[key] = col[key]; 
     } 
     return values; 
    } 
} 

用法:

[HttpPost] 
    public ActionResult Edit(MyModel model) 
    { 
     // Some stuff 
     return RedirectToAction("Index", Request.QueryString.ToRouteValues()); 
    } 

表格中查看生成的編輯(用於模態對話框):

@using (Html.BeginForm("Edit", "SomeControllerName", Request.QueryString.ToRouteValues(), FormMethod.Post)) 
    { 
     // Some stuff... e.g. dialog content 
    }