2012-10-19 18 views
9

Ich verwende Razor auf ASP.NET MVC mit C#.Verhindern Zurück Schaltfläche

Ich rufe eine externe Webseite an, um eine Kreditkarte zu bearbeiten, und sie kehrt zu mir zurück. Ich zeige dann eine Quittung an.

Ich möchte verhindern, dass sie zum vorherigen Bildschirm zurückkehren.

Ich habe keine zugrunde liegende CS-Seite, wie asp, da dies .cshtml-Dateien sind, um das Ereignis zu ergreifen.

Diese Bestätigungsseite ist eine Ansicht, so dass ich JavaScript nicht in die Kopfzeile einfügen kann, da es sich auf jede Seite auswirken würde, die es verwendet.

Wer weiß, wie ich die Rücktaste in diesem Fall verhindern?

+0

Dies wird ein JavaScript-Stück Code, um dies zu tun. C# wird damit nichts zu tun haben, da die C# Server-Seite ist. Ich bin sicher, dass Sie Stackoverflow für die Antwort darauf durchsuchen können. [Edit: Ich habe die Suche nach dir gemacht.] (Http://stackoverflow.com/search?q = prevent + back + button + browser) – Gromer

+0

Auch wenn Sie Abschnitte in Ihren Razor-Dateien verwenden, können Sie Javascript in die Seite aus einer bestimmten Razor-Datei mit Teilansicht injizieren. In diesem Blog finden Sie weitere Informationen: http://weblogs.asp.net/scottgu/archive/2010/12/30/asp-net-mvc-3-layouts-and-sections-with-razor.aspx – Gromer

+0

Can ' t Scripting im Browser deaktiviert werden, was dies ignorieren würde? – ErocM

Antwort

14

Eine Möglichkeit besteht darin, die Seite, von der Sie nicht zurückkommen möchten, vom Caching auf dem Client auszuschließen. Dies könnte durch Einstellen der richtigen Antwortheader erfolgen. Hier ein Beispiel mit einem benutzerdefinierten Aktionsfilter [NoCache], mit dem Sie die entsprechende Controller-Aktion dekorieren können.

+0

Perfekt !! Vielen Dank! – ErocM

6

Erstens, wenn die vorherige Seite Daten an den Server gesendet, am besten zu Redirect(...) zu einer anderen Aktion nach der erfolgreichen Verarbeitung zu vermeiden, wird die Daten auf „Refresh“ erneut vorgelegt werden.

Dann stellen Sie auch die Seite zu verfallen, so dass die Zurück-Taste funktioniert nicht:

https://stackoverflow.com/a/5352953/864763

+0

danke, habe ich auch diese Antwort ausgecheckt! – ErocM

3

Sie die falsche Frage sind gefragt. Versuchen Sie nicht, "Zurück" auf dem Client zu deaktivieren. Dies wird zum Scheitern verurteilt sein; Sie können es vielleicht schwieriger machen, aber Sie werden diesen Kampf nie gewinnen. Stattdessen sollten Sie die betreffende Seite so umschreiben, dass sie die Kreditkarte nur einmal bearbeiten wird. Sie sollten sich (auf dem Server) "erinnern", dass Sie die Kreditkarte verarbeitet haben, damit der Benutzer, wenn er die Seite erneut einreicht, eine Fehlermeldung mit der Meldung "Sie haben diese Informationen bereits übermittelt haben senden Sie diese Anfrage zweimal ".

Jetzt gibt es mehrere Möglichkeiten, dieses allgemeine Ziel zu erreichen, und einige sind besser als andere, aber das ist das Ziel, das Sie anstreben müssen.

Eine Möglichkeit, dies zu tun, besteht darin, zu jeder Seite zu gehen, die den Benutzer auf dieses Kreditkartenformular umleitet; Kurz bevor Sie die Anfrage senden, fügen Sie etwas zur Sitzung des Benutzers hinzu (d. h. "pendingCreditCardSubmission" = true). Sobald sie diese Anfrage gesendet haben, suchen Sie nach dieser Sitzungsvariablen. Wenn es wahr ist, senden Sie die Anfrage und setzen Sie sie auf false, wenn sie falsch ist oder nicht, dann senden Sie eine Fehlermeldung an den Benutzer.

+0

Hier; Habe eine Antwort auf eine wirklich alte Antwort! –

1

Dies ist, wie wir es getan haben:

diese
public class NoBackFilterAttribute : ActionFilterAttribute 
{ 
    public override void OnActionExecuting(ActionExecutingContext filterContext) 
    { 
     filterContext.HttpContext.Response.ExpiresAbsolute = DateTime.Now; 
     filterContext.HttpContext.Response.Expires = 0; 
     filterContext.HttpContext.Response.CacheControl = "no-cache"; 
     filterContext.HttpContext.Response.Buffer = true; 
     filterContext.HttpContext.Response.Cache.SetCacheability(HttpCacheability.NoCache); 
     filterContext.HttpContext.Response.Cache.SetExpires(DateTime.UtcNow); 
     filterContext.HttpContext.Response.Cache.SetNoStore(); 
     filterContext.HttpContext.Response.Cache.SetRevalidation(HttpCacheRevalidation.AllCaches); 
     if (!filterContext.HttpContext.Request.IsAjaxRequest() && filterContext.HttpContext.Request.HttpMethod != "POST" && !filterContext.Controller.ControllerContext.IsChildAction) 
     { 
      var after = filterContext.HttpContext.Request.RawUrl; 
      var session = GetSession(filterContext); 
      if (session["Current"] != null) 
      { 


       if (session["Before"] != null && session["Before"].ToString() == after) 
        filterContext.HttpContext.Response.Redirect(session["Current"].ToString()); 
       else 
       { 
        session["Before"] = session["Current"]; 
        session["Current"] = after; 
       } 
      } 
      else 
      { 
       session["Current"] = after; 
      } 
     } 
     base.OnActionExecuting(filterContext); 

    } 

    private HttpSessionStateBase GetSession(ActionExecutingContext context) 
    { 
     return context.HttpContext.Session; 
    } 

} 

Nachdem Sie es Rahmen entweder in den allgemeinen Anwendungsbereich oder in der Steuerung implementieren können.

1

Es ist lange her, dass dies gefragt wurde, aber mein Update war das Hinzufügen von [NoCache] über der WebPageController-Klasse.

[NoCache] 
public class WebPageController : Controller 
{ 
    public JsonResult JsonError(Exception exception) 
    { 
     if (exception == null) throw new ArgumentNullException("exception"); 

     Response.StatusCode = 500; 

     return new JsonResult 
     { 
      JsonRequestBehavior = JsonRequestBehavior.AllowGet, 
      Data = new 
      { 
       error = true, 
       success = false, 
       message = exception.Message, 
       detail = exception.ToString() 
      } 
     }; 
    }