26

Chcę się upewnić, że określony parametr w QueryString, w moim przypadku request_id jest propagowany do przekierowanej akcji.Propagowanie parametru QueryString w wywołaniach RedirectToAction

Powiedz na przykład mam Akcja First,

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

    return RedirectToAction("Second"); 
} 

teraz mówić, że First postback miał parametr w QueryString, co chciałbym przekazać do działania Second. Jednym ze sposobów byłoby przekazać wartość w samej rozmowy RedirectToAction,

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

Ale muszę to zrobić w szeregu działań i jestem niechętny, aby włączyć logikę propagacji prośba id wewnątrz działania. Byłoby lepiej, gdybym mógł włączyć to wewnątrz ActionFilter, ale nie mogę dowiedzieć się, jak dodać parametry do QueryString z ActionFilter. Jakieś pomysły?

Odpowiedz

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

, a następnie:

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

    return RedirectToAction("Second"); 
} 
+1

@ Darin .. Tylko dla wiedzy .. Czy mogę wiedzieć, jaka jest zaleta tego wdrożenia w stosunku do Session lub TempData? –

+2

@alok_dida, TempData używa sesji za kulisami. Osobiście nigdy nie używam Sesji w moich aplikacjach. Wolę projektować je w sposób bezpaństwowy i relaksujący. Odkąd wyłączam sesję w web.config (''), Cóż, Sesja i TempData nie dotyczą mnie. –

+0

@Darin .. Oks. Jeszcze jedno pytanie (mam nadzieję, że nie drażni mnie moja paczka pytań), wdrażam jedną aplikację, która korzysta z uwierzytelniania formularza. Chcę zachować "UserID" zalogowanego użytkownika przez całą aplikację. Jak mogę wdrożyć ten scenariusz bez korzystania z sesji? Używam MVC 3. –

0

Jeśli potrzebujesz go w kolejnych działaniach, dodaj to, że param w Sesji lub TempData (ale trzeba ponownie przypisać w każdej akcji), więc nie musisz przekazywać go jako zapytania o kolejne akcje. W przypadku sesji, po wykonaniu wszystkich czynności, niż usunięcie tego klucza z sesji.

+0

będę potrzebować dane w odświeżenie zbyt .. więc muszę przekazać go w QueryString –

+0

Łatwo pobierzesz dane z sesji, dopóki nie usuniesz klucza z sesji, aby dane były również dostępne w akcji odświeżenia. –

Powiązane problemy