Domanda

Sto lavorando su un'applicazione web di gestione dei progetti.L'utente ha diversi modi per visualizzare un elenco di attività.Quando visualizzano una pagina di elenco, fanno clic sull'attività e vengono reindirizzati alla pagina di modifica dell'attività.

Dal momento che provengono da una varietà di modi, sono solo curioso di sapere quali migliore modo per reindirizzare l'utente torna alla pagina chiamante.Ho alcune idee, ma vorrei ricevere il contributo di altri sviluppatori.

Conserveresti il chiamando URL in sessione?come un biscotto?Mi piace il concetto di utilizzo di un oggetto maniglia il reindirizzamento.

È stato utile?

Soluzione

Memorizzerei l'URL di riferimento utilizzando il file VisualizzaStato.Memorizzarlo al di fuori dell'ambito della pagina (ad es.nello stato Sessione o cookie) può causare problemi se è aperta più di una finestra del browser.

L'esempio seguente conferma che la pagina è stata chiamata internamente (ad es.non richiesto direttamente) e ritorna alla pagina di riferimento dopo che l'utente ha inviato la propria risposta.

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);
    }
}

Altri suggerimenti

Questo messaggio può essere etichettato come asp.net, ma penso che sia un problema indipendente dalla piattaforma che affligge tutti i nuovi sviluppatori web mentre cercano un modo "pulito" per farlo.

Penso che le due opzioni per raggiungere questo obiettivo siano:

  1. Un parametro nell'URL
  2. Un URL memorizzato nella sessione

Non mi piace il metodo URL, è un po' complicato e devi ricordarti di includere il parametro in ogni URL pertinente.

Per questo utilizzerei semplicemente un oggetto con metodi statici.L'oggetto avvolgerebbe l'elemento della sessione utilizzato per archiviare gli URL di reindirizzamento.

I metodi sarebbero probabilmente i seguenti (tutti statici pubblici):

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

setRedirectUrl verrebbe chiamato in qualsiasi azione che produce collegamenti/moduli che devono reindirizzare a un determinato URL.Quindi supponiamo che tu abbia un'azione di visualizzazione dei progetti che genera un elenco di progetti, ciascuno con attività che possono essere eseguite su di essi (ad es.delete, edit) chiameresti RedirectClass.setRedirectUrl("/project/view-all") nel codice per questa azione.

Quindi diciamo che l'utente fa clic su Elimina, deve essere reindirizzato alla pagina di visualizzazione dopo un'azione di eliminazione, quindi nell'azione di eliminazione chiameresti RedirectClass.setRedirectUrl("/project/view-all").Questo metodo cercherà di verificare se la variabile di reindirizzamento è stata impostata nella sessione.In tal caso, reindirizza a quell'URL.In caso contrario, reindirizza all'URL predefinito (la stringa passata al metodo setRedirectUrl).

Sono d'accordo con "rmbarnes.myopenid.com" riguardo al problema come indipendente dalla piattaforma.

Memorizzerei l'URL della pagina chiamante in QueryString o in un campo nascosto (ad esempio in ViewState per ASP.NET).Se lo memorizzerai al di fuori dell'ambito della pagina (come Session, variabile globale - Stato dell'applicazione e così via), non sarà semplicemente eccessivo come ha detto Tom ma ti causerà problemi.

Che tipo di problema?Problema se l'utente ha più di una scheda (finestra) aperta del browser.Le schede (o finestre) dello stesso browser condivideranno probabilmente la stessa sessione e il reindirizzamento non sarà quello previsto e l'utente penserà solo che si tratti di un bug.

I miei 2 centesimi di euro..

Personalmente memorizzerei le informazioni di reindirizzamento richieste in un oggetto e le gestirei a livello globale.Eviterei di utilizzare un parametro QueryString o simili poiché potrebbero provare a tornare a una pagina a cui non dovrebbero (possibile problema di sicurezza?).Potresti quindi creare un metodo statico per gestire l'oggetto di reindirizzamento, che potrebbe leggere le informazioni e agire di conseguenza.Questo incapsula il processo di reindirizzamento in una pagina.

Usare un oggetto significa anche che puoi estenderlo in seguito se necessario (ad esempio aggiungendo messaggi di risposta e altre informazioni).

Ad esempio (questa è una linea guida approssimativa di 2 minuti, a proposito!):

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;
    }
}
Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top