26

我想確保QueryString中的特定參數(在本例中爲request_id)傳播到重定向的操作。在RedirectToAction調用中傳播QueryString參數

比方說,我有一個動作First

[HttpPost] 
public ActionResult First() 
{ 
    //////////////////// 
    // Lots of code ... 
    //////////////////// 

    return RedirectToAction("Second"); 
} 

現在說了,First回傳曾在QueryString一個參數,我想傳遞給Second行動。這樣做將是在RedirectToAction調用本身傳遞價值的一種方式,

string requestId = Request.QueryString[REQUEST_ID_KEY]; 
return RedirectToAction("Second", new { REQUEST_ID_KEY = requestId }); 

但我不得不這樣做的一系列動作的,我不願意納入行動中請求ID傳播邏輯。如果我可以將它合併到ActionFilter中會更好,但我無法弄清楚如何將參數從ActionFilter添加到QueryString中。有任何想法嗎?

回答

48
public class PreserveQueryStringAttribute : ActionFilterAttribute 
{ 
    public override void OnActionExecuted(ActionExecutedContext filterContext) 
    { 
     var redirectResult = filterContext.Result as RedirectToRouteResult; 
     if (redirectResult == null) 
     { 
      return; 
     } 

     var query = filterContext.HttpContext.Request.QueryString; 
     // Remark: here you could decide if you want to propagate all 
     // query string values or a particular one. In my example I am 
     // propagating all query string values that are not already part of 
     // the route values 
     foreach (string key in query.Keys) 
     { 
      if (!redirectResult.RouteValues.ContainsKey(key)) 
      { 
       redirectResult.RouteValues.Add(key, query[key]); 
      } 
     } 
    } 
} 

然後:

[HttpPost] 
[PreserveQueryString] 
public ActionResult First() 
{ 
    //////////////////// 
    // Lots of code ... 
    //////////////////// 

    return RedirectToAction("Second"); 
} 
+1

@Darin ..只是爲了知識..我可以知道這個實現優於Session或TempData的優點嗎? – 2012-03-27 06:52:38

+2

@alok_dida,TempData在幕後使用Session。我個人從未在我的應用程序中使用Session。我更喜歡用無狀態和REST風格的方式來設計它們。所以,因爲我在web.config('')中禁用了會話,所以Session和TempData不適用於我。 – 2012-03-27 06:55:10

+0

@Darin .. Oks。還有一個問題(我希望你不會因爲我的一堆問題而煩惱),我正在實現一個使用表單身份驗證的應用程序。我想通過應用程序保持登錄用戶的「用戶ID」。我如何在不使用Session的情況下實現這個場景?我正在使用MVC 3. – 2012-03-27 07:39:07

0

如果您在後續操作中需要它,請將它添加到Session或TempData中(但需要在每個操作中重新分配),因此您不需要在每個操作中將它作爲查詢字符串傳遞。在會話的情況下,一旦完成所有操作而不是從會話中刪除該密鑰。

+0

我需要在回傳的數據也寫了..所以我必須將它傳中QueryString – 2012-03-27 05:22:55

+0

您將很容易地從會話中獲取數據,直到您不會從會話中刪除密鑰,以便數據在回發操作中可用。 – 2012-03-27 05:50:31