在RedirectToAction调用中传播QueryString参数

Arn*_*rty 31 asp.net asp.net-mvc redirecttoaction action-filter asp.net-mvc-3

我想确保QueryString中的特定参数,在我的情况下,request_id传播到重定向的操作.

比方说,我有一个动作First,

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

    return RedirectToAction("Second");
}
Run Code Online (Sandbox Code Playgroud)

现在说,First回发中有一个参数QueryString,我想传递给Second动作.一种方法是传递RedirectToAction调用本身的值,

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

但我必须在一系列操作中执行此操作,并且我不愿意将请求ID传播逻辑合并到操作中.如果我可以将其合并到一个内容中会更好ActionFilter,但我无法弄清楚如何从ActionFilter向QueryString添加参数.有任何想法吗?

Dar*_*rov 50

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]);
            }
        }
    }
}
Run Code Online (Sandbox Code Playgroud)

然后:

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

    return RedirectToAction("Second");
}
Run Code Online (Sandbox Code Playgroud)

  • 在 .netcore 中,您将使用 Request.Query 而不是 Request.QueryString。希望它可以帮助某人 (3认同)
  • @alok_dida,TempData在幕后使用Session.我个人从不在我的应用程序中使用Session.我更喜欢以无状态和RESTful方式设计它们.所以,因为我在web.config中禁用了会话(`<sessionState mode ="Off"/>`),所以Session和TempData不适用于我. (2认同)