Распространение параметра QueryString в вызовах RedirectToAction - PullRequest
30 голосов
/ 27 марта 2012

Я хочу убедиться, что определенный параметр в 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 });

Но я должен сделать это в серии действий, и я не желаю включать логику распространения идентификатора запроса внутриДействие.Было бы лучше, если бы я мог включить это в ActionFilter, но я не могу понять, как добавить параметры в QueryString из ActionFilter.Есть идеи?

Ответы [ 3 ]

50 голосов
/ 27 марта 2012
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");
}
0 голосов
/ 19 июля 2012

Вот блог, который я написал о том, как свободно добавить параметры строки запроса в действии

0 голосов
/ 27 марта 2012

Если вам нужно это в последующем действии, пожалуйста, добавьте этот параметр в Session или TempData (но нужно переназначать в каждом действии), чтобы вам не нужно было передавать его как строку запроса в каждом действии. В случае сеанса, когда вы закончите со всеми действиями, чем удалить этот ключ из сеанса.

...