2009-05-02 86 views
95

vamos a suponer que tengo algunas páginas¿Cómo puedo redireccionar a la acción anterior en ASP.NET MVC?

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

que puede llamar a un controlador de utilidad común, como

locale/change/es o authorization/login

¿Cómo consigo estos métodos (change, login) para redirigir a las acciones anteriores (details, info, bar) al pasar los parámetros anteriores a ellos (5, bob, 7)?

En resumen: ¿Cómo puedo redireccionar a la página que acabo de visitar después de realizar una acción en otro controlador?

Respuesta

121

intento:

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

alternativamente, tocando lo que dijo Darin, intente esto:

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

a continuación:

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

Cerrar. Utilicé return Redirect (Request.UrlReferrer.ToString()); – adolfojp

+0

Solo una sugerencia: puede usar "Redirigir" explícitamente, es más difícil probar la unidad en su controlador. Es mejor utilizar un "RedirectToAction" en su lugar. – Syd

+0

Recomiendo usar 'Request.Url.AbsolutePath.ToString()' ya que el método 'LogOn' de' AccountController' contiene comprobaciones para las URL que comienzan con ''/'', etc. – fuzz

6

pasar un parámetro ReturnURL (url codificada) a la cambio y entrada acciones y en el interior de redirección para este ReturnURL dado. Su acción de acceso podría ser algo como esto:

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

Una sugerencia de cómo hacer esto s UCH que:

  1. la url de retorno sobrevive la petición de un formulario de envío (y cualquier validaciones fallidas)
  2. la url de retorno se determina a partir de la URL de referencia inicial
  3. sin utilizar TempData [] u otro estado del lado del servidor
  4. maneja la navegación directa a la acción (proporcionando una redirección por defecto)

.

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

podría utilizar el redireccionamiento dentro de la vista como esta:

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

Si no tienen que ver con la unidad de pruebas a continuación, sólo se puede escribir:

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

Si desea redirigir desde un botón en la Vista que puede usar:

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

En MVC usando HTML plano en la vista Página con java script onclick

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

Esto funciona muy bien. la esperanza ayuda a alguien

@JuanPieterse ya ha contestado usando @Html.ActionLink así que si es posible que alguien pueda comentar o responder usando @Url.Action

1

Se podría volver a la página anterior mediante el uso de ViewBag.ReturnUrl propiedad.

1

Para construir dinámicamente la ReturnURL en cualquier vista, intente esto:

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

Esto también funciona en el diseño de páginas, vistas parciales y HTML Ayudantes

relacionadas: MVC3 Dynamic Return URL (igual pero a partir de dentro de cualquier Controlador/Acción)

1

Estoy usando .Net Core 2 MVC, y este me funcionó, en el control r use HttpContext.Request.Headers["Referer"];

Cuestiones relacionadas