2017-04-24 1 views
1

In meiner Anwendung speichere ich ein Objekt in einer Sitzung, die an einen Webdienst übergeben wird, um Daten zur Anzeige in einer Tabelle zurückzugeben. Wenn die Sitzung existiert, wird der Benutzer nicht aufgefordert, neue Daten einzugeben. Wenn ein Benutzer jedoch einen Link namens "Neue Liste" auswählt, werden die Sitzungsdaten gelöscht und der Benutzer aufgefordert, neue Daten einzugeben.C# mvc: RedirectToAction() und Browser-Navigationsschaltflächen

<a href="@Url.Action("NewList", "Alert")"> New List</a> 

Welche diese Controller Aktion auslösen:

In meinem Code, ich habe einen Anker wie so definiert

public ActionResult NewList() 
{ 
    Session["new_list"] = "y"; 
    return RedirectToAction("List"); 
} 

Und dann weiterhin diese Aktion auszuführen:

public ActionResult List() 
    { 
     if ((string)Session["new_list"] == "y") 
     { 
      //clear session variables, load fresh data from API 
     }else{ 
      //display blank table. Ask user to input data to retrieve a list 
     } 
     .... 
    } 

Jetzt ist das Problem, das ich habe, wenn ein Benutzer weg von der Liste Seite navigiert und dann zurück wi navigiert Wenn der Zurück-Knopf des Browsers gedrückt wird, ruft er immer noch newlist an. In der Geschichte des Browsers speichert Listnewlist, die verursacht, die Sitzungsvariable zu löschen. Was kann ich tun, um dies zu verhindern oder gibt es einen anderen Mechanismus in C# mvc, der mir helfen kann, den gewünschten Effekt zu erzielen?

+0

Setzen Sie es in einen Cookie. – CodingYoshi

Antwort

1

Ihr Hauptproblem ist, dass die NewList Aktion verwendet erhalten, wenn es wirklich ein POST sein sollte.

A GET Anforderung soll niemals den Status einer Ressource ändern, sondern einfach den aktuellen Status der Ressource zurückgeben; während eine POST Anfrage die Änderung einer Ressource ermöglicht.

Da Sie zulassen, dass die NewList-Aktion mit einer GET-Anforderung aufgerufen wird, nimmt der Browser des Benutzers (zu Recht seinerseits) an, dass nichts Schlechtes/Unerwünschtes passieren wird, wenn es die Anforderung einfach in der Zukunft wiederholt, z. wenn ein Benutzer die Zurück-Schaltfläche verwendet.

Wenn stattdessen eine POST-Anforderung ausgegeben wird, wird ein Benutzerbrowser die Anforderung nie erneut ausgeben, ohne dass der Benutzer bestätigt, dass er sie tatsächlich erneut ausgeben möchte.

Die Lösung für Ihr Problem dann diese Muster zum Standard PRG ändern: POST/Redirect/GET; Das heißt, senden Sie eine POST-Anforderung, um die Statusänderung auszuführen, den Benutzerbrowser auf eine andere Seite umzuleiten und die Ergebnisseite abzurufen. In diesem Schema würde das Drücken der Zurück-Taste effektiv über die Statusänderungsaktion "überspringen" und die vorherige Seite aufrufen, auf der sich der Benutzer befand.

dies in MVC zu erreichen:

[HttpPost] 
public ActionResult NewList() 
{ 
    //clear session variables, load fresh data from API 
    return RedirectToAction("List"); 
} 

public ActionResult List() 
{ 
    // whatever needs to happen to display the state 
} 

Dies bedeutet, dass Sie die „Neue Liste“ Aktion direkt als Hyperlink auf der Seite zur Verfügung stellen können, da diese immer GET-Anfragen ausgeben.Sie müssen ein minimales Formular wie folgt verwenden: <form method="post" action="@Url.Action("NewList", "Alert")"><button type="submit">New List</button></form>. Sie können die Schaltfläche so formatieren, dass sie wie ein normaler Hyperlink aussieht.

+0

das ist eine gute Lösung. Danke, dass du dir die Zeit genommen hast zu antworten. Obwohl ich denke, dass ich eine kürzere Lösung gefunden habe, die '[HttpGet, OutputCache (NoStore = true, Duration = 1)]' oberhalb der Aktionsdefinition verwendet. Dadurch wird der Browser gezwungen, eine Seite von Grund auf neu zu laden und nicht aus dem Cache. Was scheint gerade passiert zu sein – Notaras

+0

Ich glaube nicht, dass Ihr Problem überhaupt etwas mit Caching zu tun hat, besonders da Sie bemerken, dass ein Benutzer, der die Zurück-Taste drückt, versehentlich seine Liste löscht (was anzeigt, dass der Browser eine Anfrage gesendet hat) auf den Server und nicht aus seinem Cache!) Es gibt Sicherheitsüberlegungen für diese auch, bedenken Sie, dass ich unter Ihrem aktuellen Schema kann ein oder

0

Der Grund für das Speichern von NewList ist, dass Sie auf "Alert/NewList" umleiten, und die Zeichenfolge in Ihrer URL für Treffer auf "NewList" Aktion, also, wenn Sie versuchen, zurück, erhält der Browser diese "Alert/NewList "URL, daher macht es die Aktion" NewList ". Aber jetzt verstehe ich nicht, warum die Sitzung klar wird. weil Sie die Sitzung in "NewList" selbst initialisieren. Trotzdem empfehle ich Ihnen, den lokalen Speicher zu verwenden, um Werte mit der Sitzung zuzuweisen.

Verwandte Themen