2009-06-27 19 views
5

Título lo dijo todo.ASP.NET MVC ¿cómo implementar el enlace que regresa a la página anterior?

un poco de contexto:
Tengo un mecanismo de búsqueda - Buscar en la vista, los resultados de búsqueda de vista y una vista de detalles (lo que representa un elemento de los resultados, como un formview en formularios web). Quiero un enlace en la vista de detalles, que devolvería al usuario la vista de resultados de búsqueda.

ideas:
Sólo leen sobre TempData, pero supongo que eso no ayudaría, porque el usuario podría llamar algunas acciones antes de que él quiere volver.

La sesión puede funcionar, pero no estoy seguro de cómo exactamente debo manejarla.

No quiero usar javascript para lograr esto.

Editar:
Parece que me quedo con solución eu-ge-ne`s. Aquí está el resultado:

#region usages 

using System.Web.Mvc; 
using CompanyName.UI.UIApp.Infrastructure.Enums; 

#endregion 

namespace CompanyName.UI.UIApp.Infrastructure.Filters 
{ 
    /// <summary> 
    /// Apply on action method to store URL of request in session 
    /// </summary> 
    public class RememberUrlAttribute : ActionFilterAttribute 
    { 
     public override void OnActionExecuting 
      (ActionExecutingContext filterContext) 
     { 
      var httpContext = filterContext.HttpContext; 

      if (httpContext.Request.RequestType == "GET" 
       && !httpContext.Request.IsAjaxRequest()) 
      { 
       SessionManager 
       .Save(SessionKey.PreviousUrl, 
         SessionManager.Get(SessionKey.CurrentUrl) ?? 
         httpContext.Request.Url); 

       SessionManager 
       .Save(SessionKey.CurrentUrl, 
         httpContext.Request.Url); 
      } 
     } 
    } 
} 

Por cierto, ¿cómo funciona el método .IsAjaxRequest()? ¿Entiende solo MS AJAX o es más inteligente que eso?

+0

Es posible que desee explicar que no lo hace quiero usar javascript ... al menos estoy asumiendo que no quieres? –

+1

En realidad, no veo la forma en que JavaScript podría ayudar. Incluso podría, soy cauteloso contra js si está relacionado con la navegación porque los motores de búsqueda no entienden js. –

+0

"¿Cómo funciona el método .IsAjaxRequest()?" - Busca "X-Solicitado-Con" en la solicitud. Debería funcionar con MSAjax y jQuery. Mire la fuente de ASP.NET MVC -> AjaxRequestExtension.cs –

Respuesta

5

creo que necesita algo como esto filtro personalizado (no probado - no tienen VS por el momento):

public class PrevUrlAttribute : ActionFilterAttribute 
{ 
    public override void OnActionExecuting(ActionExecutingContext filterContext) 
    { 
     var httpContext = filterContext.HttpContext; 
     var session = filterContext.HttpContext.Session; 

     if (httpContext.Request.RequestType == "GET" 
      && !httpContext.Request.IsAjaxRequest()) 
     { 
      session["PrevUrl"] = session["CurUrl"] ?? httpContext.Request.Url; 
      session["CurUrl"] = httpContext.Request.Url; 
     } 
    } 
} 
+0

Aha ... también pensó en un filtro. Lo probaré. –

+0

Un problema más: su filtro recoge la URL anterior, no la actual (llamé filtro como RememberUrl, por lo que se supone que recuerda la URL actual). Pero eso ya es paz de tarta para arreglar. ;) –

1

Puede examinar el encabezado HTTP Referrer para recuperar la URL anterior.

Por supuesto, deberá manejar con elegancia en caso de que el usuario no pase este valor.

+0

¿Qué sucede si el usuario hace algo en la página de detalles? Él podría llamar algunas acciones allí. Eso haría que este examen y recordar el encabezado Referrer sea bastante complicado. –

+1

Si el encabezado de referencia resulta útil en su escenario, se puede encontrar en Request.UrlReferrer – bingles

-2
<a href="javascript:go(-1)">Yo</a> 

:)

+4

Yo

+1

Si el usuario está en una página y realiza alguna acción que lo redirecciona a la misma página, esto lo devolverá a la misma página nuevamente ... – madeinstefano

Cuestiones relacionadas