2009-05-02 15 views
95

Lets supporre che ho alcune pagineCome reindirizzare all'azione precedente in ASP.NET MVC?

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

che può chiamare un controller di utilità comune come

locale/change/es o authorization/login

Come posso ottenere questi metodi (change, login) per reindirizzare alle azioni precedenti (details, info, bar) passando i parametri precedenti a loro (5, bob, 7)?

In breve: come faccio a reindirizzare alla pagina che ho appena visitato dopo aver eseguito un'azione in un altro controller?

risposta

121

prova:

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

in alternativa, toccando quello che ha detto Darin, provate questo:

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

poi:

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

Chiudere. Ho usato return Redirect (Request.UrlReferrer.ToString()); – adolfojp

+0

Solo un suggerimento: è possibile utilizzare "Redirect" esplicitamente è più difficile testare il controller dell'unità. Preferisci invece utilizzare una "RedirectToAction". – Syd

+0

Suggerirei di usare 'Request.Url.AbsolutePath.ToString()' poiché il metodo 'LogOn' di' AccountController' contiene il controllo dell'URL che inizia con ''/'', ecc. – fuzz

6

passare un parametro ReturnURL (URL codificato) al cambiamento e login azioni e dentro redirect a questa data ReturnURL. La vostra azione di login potrebbe essere simile a questo:

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

Un suggerimento su come fare questo s uch che:

  1. l'URL di ritorno sopravvive la richiesta di un modulo POST (ed eventuali convalide falliti)
  2. l'URL di ritorno è determinata dal URL di riferimento iniziale
  3. senza utilizzare TempData [] o altro stato lato server
  4. gestisce la navigazione diretta verso l'azione (fornendo un reindirizzamento di default)

.

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 
    } 
} 

è possibile utilizzare il reindirizzamento all'interno della vista in questo modo:

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

Se non siete interessati con unit testing, allora si può semplicemente scrivere:

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

Se si desidera reindirizzare da un pulsante nella vista che è possibile utilizzare:

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

MVC utilizzando HTML pianura In visualizzazione pagina con java script onclick

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

Questa grande opera. la speranza aiuta qualcuno

@JuanPieterse ha già risposto con @Html.ActionLink in modo, se possibile, qualcuno può commentare o rispondere utilizzando @Url.Action

1

Si potrebbe tornare alla pagina precedente utilizzando ViewBag.ReturnUrl proprietà.

1

per costruire dinamicamente il ReturnURL in qualsiasi vista, provate questo:

@{ 
    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> 

Questo funziona anche in Layout Pages, vista parziale e Html aiutanti

correlate: MVC3 Dynamic Return URL (Same but da all'interno di qualsiasi controller/azione)

1

Sto usando. NET Core 2 MVC, e questo ha funzionato per me, nel controlle Utilizzare HttpContext.Request.Headers["Referer"];

Problemi correlati