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

相关问题