2009-06-27 16 views
5

Tytuł powiedział wszystko.ASP.NET MVC, jak zaimplementować link, który powraca do poprzedniej strony?

Niektóre kontekst:
mam mechanizm wyszukiwania - widok wyszukiwania, widok wyników wyszukiwania oraz widoku szczegółów (co stanowi jedną pozycję wyników, jak FormView w webforms). Chcę wyświetlić widok linku w widoku szczegółów, który spowoduje powrót użytkownika do widoku wyników wyszukiwania.

Pomysły:
Wystarczy przeczytać o TempData, ale myślę, że nie pomoże, bo użytkownik może wywołać pewne działania, zanim on chce powrócić.

Sesja może działać, ale nie jestem pewna, jak powinienem sobie z tym poradzić.

Nie chcę używać javascript, aby to osiągnąć.

Edit:
Wydaje się, że będę trzymać roztworem eu-ge-ne`s. Oto wynik:

#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, jak działa metoda .IsAjaxRequest()? Rozumie tylko MS AJAX lub jest mądrzejszy?

+0

Czasami warto wyjaśnić, że nie chcesz używać javascript ... przynajmniej zakładam, że nie chcesz tego zrobić? –

+1

W rzeczywistości nie widzę sposobu, w jaki javascript mógłby pomóc. Nawet może, jestem ostrożny wobec js, jeśli jest to związane z nawigacją, ponieważ wyszukiwarki nie rozumieją js. –

+0

"jak działa metoda .IsAjaxRequest()?" - W żądaniu szuka "X-Requested-With". Powinien pracować z MSAjax i jQuery. Spójrz na źródło MVC ASP.NET -> AjaxRequestExtension.cs –

Odpowiedz

5

myślę, że trzeba coś takiego niestandardowego filtra (nie testowany - VS nie mają w danej chwili):

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 ... także pomyślał o filtrze. Dam temu szansę. –

+0

Jeszcze jedno zagadnienie - twój filtr odbiera poprzedni URL, a nie aktualny (nazwałem filtr jako RememberUrl, więc - powinien pamiętać aktualny adres URL). Ale to już jest spokój z tortem, żeby naprawić. ;) –

1

Możesz sprawdzić nagłówek odsyłacza HTTP, aby pobrać poprzedni adres URL.

Oczywiście będziesz musiał poradzić sobie z wdziękiem, na wypadek gdyby użytkownik nie przekazał tej wartości.

+0

Co zrobić, jeśli użytkownik robi coś na stronie szczegółów? Może nazwać tam pewne akcje. To sprawiłoby, że ten egzamin i pamiętanie nagłówka Referatora byłyby dość trudne. –

+1

Jeśli nagłówek strony wywołującej okaże się przydatny w twoim scenariuszu, można go znaleźć w Request.UrlReferrer – bingles

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

:)

+4

Yo

+1

Jeśli użytkownik znajduje się na stronie i wykonuje jakąś czynność, która przekieruje go na tę samą stronę, spowoduje to powrót do tej samej strony ... – madeinstefano

Powiązane problemy