2009-05-02 26 views
95

Pozwala przypuszczać, że mam kilka stronJak przekierować do poprzedniej akcji w ASP.NET MVC?

  • some.web/articles/details/5
  • some.web/users/info/bob
  • some.web/foo/bar/7

które można nazwać wspólny kontroler Narzędzie jak

locale/change/es lub authorization/login

Jak mogę dostać te metody (change, login) przekierować do poprzednich działań (details, info, bar) podczas przechodzenia dotychczasowe parametry do nich (5, bob, 7)?

W skrócie: Jak przekierować na stronę, którą właśnie odwiedziłem po wykonaniu czynności w innym kontrolerze?

Odpowiedz

121

try:

public ActionResult MyNextAction() 
{ 
    return Redirect(Request.UrlReferrer.ToString()); 
} 

alternatywnie, dotykając co darin powiedział, spróbuj tego:

public ActionResult MyFirstAction() 
{ 
    return RedirectToAction("MyNextAction", 
     new { r = Request.Url.ToString() }); 
} 

następnie:

public ActionResult MyNextAction() 
{ 
    return Redirect(Request.QueryString["r"]); 
} 
+65

Zamknij. Użyłem return Redirect (Request.UrlReferrer.ToString()); – adolfojp

+0

Tylko jedna sugestia: możesz użyć "Przekierowania", co jest trudniejsze do przetestowania twojego kontrolera. Zamiast tego lepiej jest użyć "RedirectToAction". – Syd

+0

Zalecam użycie 'Request.Url.AbsolutePath.ToString()', ponieważ metoda 'LogOn' kontrolera AccountController zawiera sprawdzenia adresów URL rozpoczynających się od' '/ '' itp. – fuzz

6

przekazać parametr ReturnURL (url zakodowane) do zmiany i logowanie działań wewnątrz i przekierować do tej danej ReturnURL. Twoje działanie logowanie może wyglądać tak:

public ActionResult Login(string returnUrl) 
{ 
    // Do something... 
    return Redirect(returnUrl); 
} 
7

Sugestia jak to zrobić s uch, że:

  1. URL powrotu przetrwa zwrócenie się do wpisu (i niepowodzeniem walidację)
  2. URL powrotny jest określana na podstawie początkowego odsyłający URL
  3. bez użycia TempData [] lub inny stan po stronie serwera
  4. obsługuje bezpośrednią nawigację do działania (poprzez dostarczenie domyślne przekierowanie)

.

public ActionResult Create(string returnUrl) 
{ 
    // If no return url supplied, use referrer url. 
    // Protect against endless loop by checking for empty referrer. 
    if (String.IsNullOrEmpty(returnUrl) 
     && Request.UrlReferrer != null 
     && Request.UrlReferrer.ToString().Length > 0) 
    { 
     return RedirectToAction("Create", 
      new { returnUrl = Request.UrlReferrer.ToString() }); 
    } 

    // Do stuff... 
    MyEntity entity = GetNewEntity(); 

    return View(entity); 
} 

[AcceptVerbs(HttpVerbs.Post)] 
public ActionResult Create(MyEntity entity, string returnUrl) 
{ 
    try 
    { 
     // TODO: add create logic here 

     // If redirect supplied, then do it, otherwise use a default 
     if (!String.IsNullOrEmpty(returnUrl)) 
      return Redirect(returnUrl); 
     else 
      return RedirectToAction("Index"); 
    } 
    catch 
    { 
     return View(); // Reshow this view, with errors 
    } 
} 

Można użyć przekierowanie w widoku jak ten:

<% if (!String.IsNullOrEmpty(Request.QueryString["returnUrl"])) %> 
<% { %> 
    <a href="<%= Request.QueryString["returnUrl"] %>">Return</a> 
<% } %> 
25

Jeśli nie są związane z testów jednostkowych, to możesz po prostu napisać:

return Redirect(ControllerContext.HttpContext.Request.UrlReferrer.ToString()); 
33

Jeśli chcesz przekierowanie z przycisku w widoku można użyć:

@Html.ActionLink("Back to previous page", null, null, null, new { href = Request.UrlReferrer}) 
6

w MVC przy użyciu zwykłego html w widoku strony z skrypt java onclick

<input type="button" value="GO BACK" class="btn btn-primary" 
onclick="location.href='@Request.UrlReferrer'" /> 

to działa świetnie. nadzieja pomaga komuś.

@JuanPieterse odpowiedział już przy użyciu @Html.ActionLink więc jeśli to możliwe, że ktoś może skomentować lub odpowiedzieć używając @Url.Action

1

Można powrócić do poprzedniej strony za pomocą ViewBag.ReturnUrl nieruchomości.

1

Aby dynamicznie skonstruować ReturnURL w dowolnym widoku, spróbuj tego:

@{ 
    var formCollection = 
     new FormCollection 
      { 
       new FormCollection(Request.Form), 
       new FormCollection(Request.QueryString) 
      }; 

    var parameters = new RouteValueDictionary(); 

    formCollection.AllKeys 
     .Select(k => new KeyValuePair<string, string>(k, formCollection[k])).ToList() 
     .ForEach(p => parameters.Add(p.Key, p.Value)); 
} 

<!-- Option #1 --> 
@Html.ActionLink("Option #1", "Action", "Controller", parameters, null) 

<!-- Option #2 --> 
<a href="/Controller/Action/@[email protected](ViewContext.RouteData.Values["action"].ToString(), ViewContext.RouteData.Values["controller"].ToString(), parameters)">Option #2</a> 

<!-- Option #3 --> 
<a href="@Url.Action("Action", "Controller", new { object.ID, returnUrl = Url.Action(ViewContext.RouteData.Values["action"].ToString(), ViewContext.RouteData.Values["controller"].ToString(), parameters) }, null)">Option #3</a> 

Działa to również w Layout Pages, częściowy widok i HTML Pomocników

Powiązane: MVC3 Dynamic Return URL (takie same, ale z w dowolnym kontrolerze/działaniu)

1

Używam .Net Core 2 MVC, a ten działał dla mnie, w sterowaniu r użyj HttpContext.Request.Headers["Referer"];

Powiązane problemy