26

私のケースでは、QueryStringの特定のパラメータがrequest_idがリダイレクトされたアクションに伝播されていることを確認します。RedirectToAction呼び出しでQueryStringパラメータを伝播する

Firstポストバックが、私はSecondアクションに渡すたいQueryStringでパラメータを、持っていた、

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

    return RedirectToAction("Second"); 
} 

今すぐと言う、例えば、私はアクション Firstを持っていると言います。それを行うための1つの方法は、 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

@ダーリン..知っているだけです。SessionやTempDataに比べてこの実装の利点は何ですか? –

+2

@alok_dida、TempDataはバックグラウンドでセッションを使用します。私のアプリケーションでは個人的にセッションを使用していません。私はステートレスでRESTfulな方法でそれらを設計する方が好きです。だから私はweb.config( '')でセッションを無効にしているので、セッションとTempDataは私には当てはまりません。 –

+0

@ダリン..オックス。もう1つの質問(私はあなたの質問の束に苛まれないことを願っています)、私はフォーム認証を使用する1つのアプリケーションを実装しています。私は、ログインしているユーザーの「ユーザーID」をアプリケーションの外部に保持したいと考えています。セッションを使用せずにこのシナリオを実装するにはどうすればよいですか?私はMVC 3を使用しています。 –

0

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

+0

私はあまりにもポストバックでデータが必要になります方法について書いたブログ投稿..ですので、私はそれを渡す必要がQueryString –

+0

セッションからキーを削除しないと、データがポストバックアクションでも利用できるようになるまで、Sessionからデータを簡単に取得できます。 –