web-dev-qa-db-ja.com

RedirectToAction呼び出しでのQueryStringパラメーターの伝播

QueryStringの特定のパラメーター、私の場合はrequest_idがリダイレクトされたアクションに伝播されることを確認したいと思います。

たとえば、アクションFirstがあります。

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

    return RedirectToAction("Second");
}

ここで、FirstポストバックのQueryStringにパラメーターがあり、これをSecondアクションに渡します。これを行う1つの方法は、RedirectToAction呼び出し自体に値を渡すことです。

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

しかし、私は一連のアクションでこれを行う必要があり、アクション内にリクエストID伝播ロジックを組み込みたくありません。これをActionFilter内に組み込むことができれば良いのですが、ActionFilterからQueryStringにパラメーターを追加する方法がわかりません。何か案は?

31
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");
}
50
Darin Dimitrov

後続のアクションで必要な場合は、SessionまたはTempDataにそのパラメーターを追加してください(ただし、各アクションで再割り当てする必要があります)。これにより、各アクションでクエリ文字列として渡す必要がなくなります。セッションの場合、すべてのアクションを完了したら、そのキーをセッションから削除します。

0
alok_dida

これは私が流暢に書く方法について書いたブログ投稿です アクションにクエリ文字列パラメータを追加します

0
UBCoder