Frage

Ein Problem, auf das ich immer wieder stoße, ist die Umleitung zur vorherigen Seite, nachdem ein Benutzer eine Aktion ausgeführt hat, z. B. das Klicken auf den Link "Zurück zu ..." oder das Speichern des von ihm bearbeiteten Datensatzes.

Früher, wenn ich wissen musste, zu welcher Seite ich zurückkehren soll, habe ich meiner aktuellen Ansicht einen returnURL-Parameter bereitgestellt.

http://blah.com/account/edit/1?returnURL="account/index"

Dies ist keine sehr saubere Methode, um mit dieser Situation umzugehen, da die Rückgabe-URL manchmal Parameter wie Suchzeichenfolgen usw. enthält, die in der URL enthalten sein müssen.

http://blah.com/account/edit/1?returnURL="account/index?search="searchTerm""

Dies führt auch zu einem Problem, wenn ein Benutzer eine andere Seite vorwärts gehen kann, bevor er mit dem returnURL zur Seite zurückkehrt, da Sie den returnURL über alle besuchten Seiten weitergeben müssen.

Das einfache Aufrufen der Back-Funktion des Browsers reicht auch nicht aus, da die Seite möglicherweise aktualisiert werden soll, z. um die Änderungen anzuzeigen, die Sie gerade auf der vorherigen Seite gespeichert haben.

Meine Frage ist also, hat jemand einen intelligenten Weg gefunden, um mit dieser Art von Situation umzugehen, insbesondere in einer MVC-Umgebung?

Hinweis : Ich verwende ASP .NET MVC. Wenn möglich, möchte ich Antworten dazu, jedoch sind alle Ideen willkommen.

War es hilfreich?

Lösung

Was ist falsch daran, ein Cookie zu setzen oder eine Sitzungsvariable zu verwenden?Der einzige Grund, warum Sie dies nicht tun würden, ist, wenn Sie die Seite, die Sie aufruft, nicht steuern. In diesem Fall sind Ihre einzigen Optionen Abfragezeichenfolgen, Post-Werte oder Verweise.

Andere Tipps

Ich dachte, ich könnte meine Antwort auf die Frage hinzufügen, um zu sehen, ob andere es für eine gute Idee halten.

Ich leite es einfach mit TempViewData an den Controller weiter:

@{
   TempData["returnURL"] = Request.Url.AbsoluteUri;
}

und dann auf ähnliche Weise darauf zugreifen (in meiner realen Version überprüfe ich, ob sich der Schlüssel im TempData befindet und ob der returnURL eine echte URL ist):

return Redirect(TempData["returnURL"].ToString());

Wenn es nach der ersten Seitenänderung fortgesetzt werden muss (d. h. Seite suchen -> Seite bearbeiten -> Abschnittsseite bearbeiten), füge ich es erneut hinzu

TempData["returnURL"] = TempData["returnURL"];

Überprüfen Sie meinen Blog-Beitrag darauf: UsingCookies zur Steuerung der Rückgabeseite nach dem Login auf asp.net mvc 3

Genau wie bei @Mystere Man erwähnt, können Sie einfach ein Cookie oder eine Sitzung dafür verwenden.Ich habe mich damals für Kekse entschieden, als ich vor einiger Zeit eine ähnliche Situation hatte.

Versuchen Sie, eine neue Route zu registrieren, deren URL /{controller}/{action}/{id}/returnurl/{*url} lautet, und verwenden Sie dann einen RedirectToAction in der Aktion, die url als Parameter akzeptiert

Request.UrlReferrer.AbsoluteUri

obwohl ich immer noch argumentieren würde, dass Sie nicht Ihren eigenen "Zurück" -Button erstellen sollten.

Verwenden Sie einen Abfangjäger oder einen Aspekt:

  1. Fangen Sie jede Anforderung auf irgendeine Weise ab (z. B. einen @Before-Aspekt) und speichern Sie die angeforderte URL in der Sitzung, wobei Sie sie jedes Mal überschreiben
  2. Greifen Sie in Ihrer Ansichtsebene nach Bedarf auf dieses Sitzungsobjekt zu, in Ihrem Fall für den Backlink.

    Mit dieser Art von Design haben Sie immer die aktuellste Anfrage zur Verfügung, wenn Sie sie verwenden möchten. Hier ist eineBeispiel zum Schreiben eines Aspekts / Interceptors in .NET.Außerdem ist PostSharp ein .NET-Aspektprojekt.

Gegenwärtig ist mir eine schnelle und schmutzige Methode entgangen ... also verwende ich eine praktische Methode.

Auf konzeptioneller Ebene sollte die "Back-Fähigkeit" einer Seite von der Seite bestimmt werden, auf der Sie sich gerade befinden. Die Ansicht kann dies (in den meisten Fällen) ableiten, wenn die im Controller erfassten Parameter über das ViewModel an sie übergeben werden.

Beispiel:

Nachdem ich Foo besucht habe, gehe ich zu Bar, um einige Dinge anzuzeigen, und die Zurück-Schaltfläche sollte zu Foo zurückkehren.

public ActionResult Foo(string fooId) // using a string for your Id, good idea; Encryption, even better.
{
    FooModel model = new FooModel() { fooId = fooId }; // property is passed to the Model - important.
    model.Fill();
    return View("FooView", model);
}

public ActionResult Bar(string fooId, string barId)
{
    BarModel model = new BarModel() { fooId = fooId; barId = barId };
    model.Fill()
    return View("BarView", model)
}

public class FooModel
{
    public string fooId { get; set; }

    public void Fill()
    {
        // Get info from Repository.
    }
}

public class BarModel
{
    public string fooId { get; set; }
    public string barId { get; set; }

    public void Fill()
    {
        // Get info from Repository.
    }
}

View (Partial) // No pun intended... or maybe it was. :)

Ihr BarView kann jetzt von seinem Modell aus interpretieren, wohin es zurückkehren muss (unter Verwendung von fooId).

In Ihrem BarView (mit MVC2-Syntax):

<a href="<%= string.Format("/Foo?fooId={0}", Model.fooId) %>">Back</a>

Sie können auch Html.ActionLink verwenden.

Alternativ:

Sie können Ihre ViewModels von einem BaseViewModel erben, das einen returnURL mit geschützter Eigenschaft haben kann. Stellen Sie dies bei Bedarf ein.

Beispiel:

Auf Ihrem ViewModel:

public class BarModel : BaseViewModel
{
    public string fooId { get; set; }
    public string barId { get; set; }

    public void Fill()
    {
        returnURL = string.Format("/Foo?fooId={0}", fooId)
        // Get info from Repository.
    }
}

On View:

<a href="<%=returnURL %>">Back</a>

Wäre dies besser durch Teilaktionen möglich, die angezeigt werden, ohne die Seite zu verlassen und mit JQuery einen Dialog- / Assistenten-Workflow zu erstellen?

Dann müssen Sie nur noch auf die Schaltfläche "Fertig stellen" im Dialogfeld reagieren, um die ursprüngliche Ansicht zu aktualisieren.

Für den Teil Ihrer Frage bezüglich "Speichern des Datensatzes, den sie bearbeiten" würde ich denken, dass das PGR-Muster (Post-Redirect-Get) auf Sie zutrifft.

Dies ist möglicherweise ein guter Ort, um darüber zu lesen, wenn Sie nicht damit vertraut sind.

  1. Codieren Sie die returnUrl mit Url.Encode(returnUrl), um sie in die URL aufzunehmen.
  2. Wenn Sie zur Umleitung bereit sind, verwenden Sie Url.Decode(returnUrl) und den Wert für die tatsächliche Weiterleitung.
Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top