在RedirectToAction调用中传播QueryString参数

时间:2012-03-27 04:54:29

标签: asp.net asp.net-mvc asp.net-mvc-3 action-filter redirecttoaction

我想确保QueryString中的特定参数(在我的情况下是request_id)传播到重定向的操作。

比如说,我有一个动作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添加参数。有什么想法吗?

3 个答案:

答案 0 :(得分: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]);
            }
        }
    }
}

然后:

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

    return RedirectToAction("Second");
}

答案 1 :(得分:0)

如果您在后续操作中需要它,请在Session或TempData中添加该参数(但需要在每个操作中重新分配),因此您不需要在每个操作中将其作为查询字符串传递。在会话的情况下,一旦您完成了所有操作,而不是从会话中删除该密钥。

答案 2 :(得分:0)

这是我写的关于如何流利add querystring parameters in the action

的博客文章