Asp.net

在 RedirectToAction 呼叫中傳播 QueryString 參數

  • March 27, 2012

我想確保 QueryString 中的特定參數(在我的情況下request_id)被傳播到重定向操作。

例如,我有一個 Action 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 添加參數。有任何想法嗎?

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

引用自:https://stackoverflow.com/questions/9883553