2009-06-27 5 views
5

Titel sagte alles.ASP.NET MVC wie Link implementieren, die zur vorherigen Seite zurückkehrt?

Einige Kontext:
Ich bekam einen Suchmechanismus - Suchansicht, Suchergebnisse Ansicht und eine Detailansicht (die ein Element der Ergebnisse darstellt, wie ein Formview in Webformulare). Ich möchte einen Link in der Detailansicht, der den Benutzer in die Suchergebnisansicht zurückversetzt.

Ideen:
Gerade über TempData lesen, aber ich denke, das würde einige Aktionen Ursache Benutzer nicht helfen, rufen könnte, bevor er zurückkehren will.

Sitzung könnte funktionieren, aber ich bin mir nicht sicher, wie genau ich damit umgehen sollte.

Ich möchte Javascript nicht verwenden, um dies zu erreichen.

Edit:
scheint, dass ich mit eu-ge-ne`s Lösung haftet. Hier ist Ergebnis:

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

Btw, wie funktioniert .IsAjaxRequest() Methode funktioniert? Es versteht nur MS AJAX oder es ist schlauer als das?

+0

Sie mögen vielleicht erklären, dass Sie dies nicht tun will Javascript benutzen ... zumindest gehe ich davon aus, dass du nicht willst? –

+1

Eigentlich sehe ich keinen Weg, wie Javascript helfen könnte. Auch wenn es möglich ist, bin ich vorsichtig gegen js, wenn es mit der Navigation zusammenhängt, weil Suchmaschinen js nicht verstehen. –

+0

"Wie funktioniert die. IsAjaxRequest() -Methode?" - Es sucht nach "X-Requested-With" in der Anfrage. Sollte mit MSAjax und jQuery arbeiten. Sehen Sie sich ASP.NET MVC-Quelle -> AjaxRequestExtension.cs –

Antwort

5

Ich glaube, Sie so etwas wie dieser benutzerdefinierten Filter benötigt (nicht getestet - keinen VS zur Zeit):

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 ... dachte auch an einen Filter. Ich werde es versuchen. –

+0

Ein weiteres Problem - Ihr Filter nimmt die vorherige URL auf, nicht die aktuelle (ich benannte Filter als RememberUrl, also - es soll sich an die aktuelle URL erinnern). Aber das ist schon ein friedlicher Kuchen. ;) –

1

Sie können den HTTP-Referrer-Header untersuchen, um die vorherige URL abzurufen.

Natürlich müssen Sie elegant umgehen, nur für den Fall, dass der Benutzer diesen Wert nicht übergibt.

+0

Was ist, wenn Benutzer etwas auf der Detailseite tut? Er könnte dort einige Aktionen nennen. Das würde diese Prüfung und Erinnerung an den Referrer-Header ziemlich schwierig machen. –

+1

Wenn die Referrer-Header in Ihrem Szenario nützlich ist, kann es in Request.UrlReferrer gefunden werden – bingles

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

:)

+4

Yo

+1

Wenn der Benutzer sich auf einer Seite befindet und eine Aktion ausführt, die ihn auf dieselbe Seite weiterleitet, wird er ihn nur auf die gleiche Seite zurückverweisen ... – madeinstefano

Verwandte Themen