Umleiten von Benutzern von der Bearbeitungsseite zurück zur aufrufenden Seite

StackOverflow https://stackoverflow.com/questions/36733

  •  09-06-2019
  •  | 
  •  

Frage

Ich arbeite an einer Projektmanagement-Webanwendung.Der Benutzer hat verschiedene Möglichkeiten, eine Aufgabenliste anzuzeigen.Beim Anzeigen einer Listenseite klicken sie auf eine Aufgabe und werden zur Aufgabenbearbeitungsseite weitergeleitet.

Da sie auf unterschiedliche Weise kommen, bin ich einfach neugierig am besten Weg zu umleiten der Benutzer zurück zur aufrufenden Seite.Ich habe einige Ideen, würde aber gerne den Input anderer Entwickler einholen.

Würden Sie das aufbewahren? Berufung URL in Sitzung?als Keks?Mir gefällt das Konzept, ein Objekt zu verwenden handhaben die Umleitung.

War es hilfreich?

Lösung

Ich würde die verweisende URL mit speichern Sichtzustand.Das Speichern außerhalb des Bereichs der Seite (d. h.im Sitzungsstatus oder Cookie) kann zu Problemen führen, wenn mehr als ein Browserfenster geöffnet ist.

Das folgende Beispiel bestätigt, dass die Seite intern aufgerufen wurde (d. h.nicht direkt angefordert) und kehrt zur verweisenden Seite zurück, nachdem der Benutzer seine Antwort übermittelt hat.

public partial class _Default : System.Web.UI.Page
{
    protected void Page_Load(object sender, EventArgs e)
    {
        if (Request.UrlReferrer == null)
        {
            //Handle the case where the page is requested directly
            throw new Exception("This page has been called without a referring page");
        }

        if (!IsPostBack)
        {   
            ReturnUrl = Request.UrlReferrer.PathAndQuery;
        }
    }

    public string ReturnUrl
    {
        get { return ViewState["returnUrl"].ToString();  }
        set { ViewState["returnUrl"] = value; }
    }

    protected void btn_Click(object sender, EventArgs e)
    {
        //Do what you need to do to save the page
        //...

        //Go back to calling page
        Response.Redirect(ReturnUrl, true);
    }
}

Andere Tipps

Diese Nachricht muss mit asp.net getaggt werden, aber ich denke, dass es sich um ein plattformunabhängiges Problem handelt, das alle neuen Webentwickler quält, die nach einer „sauberen“ Möglichkeit suchen, dies zu tun.

Ich denke, die zwei Möglichkeiten, dies zu erreichen, sind:

  1. Ein Parameter in der URL
  2. Eine in der Sitzung gespeicherte URL

Mir gefällt die URL-Methode nicht, sie ist etwas chaotisch und man muss daran denken, den Parameter in jede relevante URL einzufügen.

Ich würde dafür einfach ein Objekt mit statischen Methoden verwenden.Das Objekt würde das Sitzungselement umschließen, das Sie zum Speichern von Weiterleitungs-URLs verwenden.

Die Methoden wären wahrscheinlich wie folgt (alle öffentlich statisch):

  • setRedirectUrl(string URL)
  • doRedirect(string defaultURL)

setRedirectUrl wird in jeder Aktion aufgerufen, die Links/Formulare erzeugt, die zu einer bestimmten URL umgeleitet werden müssen.Angenommen, Sie hätten eine Projektansichtsaktion, die eine Liste von Projekten mit jeweils ausführbaren Aufgaben generiert (z. B.löschen, bearbeiten) würden Sie RedirectClass.setRedirectUrl("/project/view-all") im Code für diese Aktion aufrufen.

Nehmen wir an, der Benutzer klickt auf „Löschen“. Nach einer Löschaktion muss er zur Ansichtsseite weitergeleitet werden. In der Löschaktion würden Sie also RedirectClass.setRedirectUrl("/project/view-all") aufrufen.Diese Methode würde prüfen, ob die Umleitungsvariable in der Sitzung festgelegt wurde.Wenn ja, leiten Sie zu dieser URL weiter.Wenn nicht, leiten Sie zur Standard-URL weiter (der an die setRedirectUrl-Methode übergebenen Zeichenfolge).

Ich stimme mit „rmbarnes.myopenid.com“ darin überein, dass dieses Problem plattformunabhängig ist.

Ich würde die URL der aufrufenden Seite im QueryString oder in einem versteckten Feld (zum Beispiel in ViewState für ASP.NET) speichern.Wenn Sie es außerhalb des Seitenbereichs speichern (z. B. Sitzung, globale Variable – Anwendungsstatus usw.), ist es nicht nur übertrieben, wie Tom sagte, sondern es wird Ihnen auch Ärger bereiten.

Was für eine Art von Problem?Problem, wenn der Benutzer mehr als eine Registerkarte (Fenster) dieses Browsers geöffnet hat.Die Registerkarten (oder Fenster) desselben Browsers teilen sich wahrscheinlich dieselbe Sitzung und die Umleitung wird nicht die erwartete sein, und der Benutzer wird lediglich das Gefühl haben, dass es sich um einen Fehler handelt.

Meine 2 Eurocent...

Ich persönlich würde die erforderlichen Umleitungsinformationen in einem Objekt speichern und global verarbeiten.Ich würde die Verwendung eines QueryString-Parameters oder ähnliches vermeiden, da sie versuchen könnten, zu einer Seite zurückzukehren, auf die sie nicht zugreifen sollten (mögliches Sicherheitsproblem?).Anschließend könnten Sie eine statische Methode zur Verarbeitung des Umleitungsobjekts erstellen, die die Informationen lesen und entsprechend handeln könnte.Dadurch wird Ihr Weiterleitungsprozess auf einer Seite zusammengefasst.

Die Verwendung eines Objekts bedeutet auch, dass Sie es später bei Bedarf erweitern können (z. B. durch das Hinzufügen von Rückmeldungen und anderen Informationen).

Zum Beispiel (das ist übrigens eine grobe Richtlinie von 2 Minuten!):

public partial class _Default : System.Web.UI.Page 
{

    void Redirect(string url, string messsage)
    {
        RedirectionParams paras = new RedirectionParams(url, messsage);
        RedirectionHandler(paras); // pass to some global method (or this could BE the global method)
    }
    protected void Button1_Click(object sender, EventArgs e)
    {
        Redirect("mypage.aspx", "you have been redirected");
    }
}

public class RedirectionParams
{
    private string _url;

    public string URL
    {
        get { return _url; }
        set { _url = value; }
    }

    private string _message;

    public string Message
    {
        get { return _message; }
        set { _message = value; }
    }

    public RedirectionParams(string url, string message)
    {
        this.URL = url;
        this.Message = message;
    }
}
Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top