26

ich sicherstellen mag, dass ein bestimmte Parameter in der Abfrage-Zeichenfolge, in meinem Fall die request_id zu der umgeleiteten Aktion propagiert wird.Pflanzgut Abfrage-Zeichenfolge-Parameter in RedirectToAction rufen

Sagen Sie zum Beispiel, ich habe eine Aktion First,

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

    return RedirectToAction("Second"); 
} 

Jetzt sagen, der First Postbacks einen Parameter in den QueryString hatte, die ich an die Second Aktion passieren würde. Eine Möglichkeit, zu tun, wäre es den Wert in dem RedirectToAction Aufruf übergibt sich,

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

Aber ich habe von Aktionen in einer Reihe zu tun, und ich bin nicht bereit, Anforderungs-ID Ausbreitungslogik innerhalb der Aktion zu übernehmen. Es wäre besser, wenn ich dies innerhalb eineine ActionFilter nehmen könnte, aber ich kann nicht herausfinden, wie Parameter aus einer Action zur Abfrage-Zeichenfolge hinzuzufügen. Irgendwelche Ideen?

Antwort

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]); 
      } 
     } 
    } 
} 

und dann:

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

    return RedirectToAction("Second"); 
} 
+1

@Darin .. Nur für das Wissen .. Darf ich wissen, was der Vorteil dieser Implementierung über Session oder TempData ist? –

+2

@alok_dida, TempData verwendet Sitzung hinter den Kulissen. Persönlich verwende ich Session nie in meinen Anwendungen. Ich bevorzuge es, sie staatenlos und RESTful zu gestalten. So, da ich die Sitzung in web.config ('') deaktivieren, na ja, Session und TempData gelten nicht für mich. –

+0

@Darin .. Oks. Noch eine Frage (ich hoffe, Sie werden nicht mit meinem Fragenbündel irritiert), ich implementiere eine Anwendung, die Formularauthentifizierung verwendet. Ich möchte die Benutzer-ID des angemeldeten Benutzers durch die Anwendung führen. Wie kann ich dieses Szenario implementieren, ohne Session zu verwenden? Ich verwende MVC 3. –

0

Wenn Sie es in der nachfolgenden Aktion benötigen, dann fügen Sie diesen Parameter in Session oder TempData hinzu (aber müssen in jeder Aktion neu zugewiesen werden), so dass Sie es nicht als Querystring in jeder Aktion übergeben müssen. Im Falle einer Sitzung, sobald Sie alle Aktionen ausgeführt haben, entfernen Sie diesen Schlüssel aus der Sitzung.

+0

Ich werde die Daten in der Postbacks müssen .. so habe ich es in den Pass querystring –

+0

Sie einfach die Daten aus Session erhalten, bis Sie den Schlüssel aus der Sitzung nicht entfernen, so dass die Daten auch in Postback Aktion zur Verfügung. –