Domanda

Un problema che mi imbatto ripetutamente è la gestione del reindirizzamento alla pagina precedente dopo che un utente ha eseguito un'azione come fare clic su un collegamento "Torna a ..." o salvare il record che sta modificando.

In precedenza, ogni volta che avevo bisogno di sapere a quale pagina tornare, fornivo un parametro returnURL alla mia vista corrente.

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

Questo non è un modo molto chiaro per gestire questa situazione, poiché a volte l'URL di ritorno contiene parametri come stringhe di ricerca e così via che devono essere inclusi nell'URL.

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

Inoltre, questo crea un problema quando un utente può andare avanti di un'altra pagina prima di tornare alla pagina con il returnURL perché devi passare il returnURL attraverso tutte le pagine visitate.

Anche la semplice chiamata alla funzionalità Indietro del browser non è sufficiente, perché potresti volere che la pagina si aggiorni, ad es. per mostrare le modifiche appena salvate nella pagina precedente.

Quindi la mia domanda è: qualcuno ha trovato un modo intelligente per gestire questo tipo di situazione, in particolare in un ambiente MVC?

Nota : sto utilizzando ASP .NET MVC quindi, se possibile, vorrei che le risposte si riferissero a questo, tuttavia qualsiasi idea è benvenuta.

È stato utile?

Soluzione

Cosa c'è di sbagliato nell'impostare un cookie o nell'usare una variabile di sessione?L'unico motivo per cui non lo faresti è se non controlli la pagina che ti chiama, nel qual caso le tue uniche opzioni sono stringhe di query, valori di post o referrer.

Altri suggerimenti

Ho pensato di poter aggiungere la mia risposta alla domanda per vedere se gli altri pensano che sia una buona idea.

Lo sto semplicemente passando al controller usando TempViewData:

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

e poi accedendovi in modo simile a questo (nella mia versione reale controllo che la chiave sia in TempData e che il returnURL sia un vero URL):

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

Se deve continuare oltre il primo cambio di pagina (ad es. pagina di ricerca -> Modifica pagina -> Modifica pagina sezione) lo aggiungo di nuovo

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

Controlla il mio post del blog su di esso: Utilizzocookie per controllare la pagina di ritorno dopo il login su asp.net mvc 3

Proprio come menzionato da @Mystere Man, puoi semplicemente usare un cookie o una sessione per questo.Ho scelto i biscotti quando ho avuto una situazione simile qualche tempo fa.

Prova a registrare un nuovo percorso di cui l'URL è /{controller}/{action}/{id}/returnurl/{*url} e quindi utilizza un RedirectToAction nell'azione che accetta url come parametro

Request.UrlReferrer.AbsoluteUri

anche se continuo a sostenere che non dovresti creare il tuo pulsante "indietro".

Utilizza un intercettore o un aspetto:

  1. Intercetta ogni richiesta in qualche modo (ad es. un aspetto @Before) e salva l'URL richiesto nella sessione, sovrascrivendolo ogni volta
  2. Nel tuo livello di visualizzazione, accedi all'oggetto Session secondo necessità, nel tuo caso per il link a ritroso.

Questo tipo di design ti consente di avere sempre la richiesta più recente disponibile se vuoi usarla. Ecco unesempio per scrivere un aspetto / interceptor in .NET.Inoltre, PostSharp è un progetto con aspetti .NET.

Attualmente, un metodo veloce e sporco mi ha elulato ... quindi sto usando un metodo pratico.

A livello concettuale, la "Back-Aibile" di una pagina dovrebbe essere determinata dalla pagina che sei attualmente acceso. La vista può dedurre questo (nella maggior parte dei casi) se i parametri catturati nel controller sono passati tramite il ViewModel.

Esempio:

Avendo visitato Foo, vado a Bar per visualizzare alcune cose e il pulsante Back dovrebbe tornare a Foo.

controller

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

ViewModels

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.
    }
}
.

Visualizza (parziale) // No pun intended... or maybe it was. :)

Il tuo barview ora può interpretare dal suo modello in cui è necessario tornare a (usando fooId).

sul tuo barview (utilizzando la sintassi MVC2):

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

È possibile utilizzare anche HTML.ActionLink.

In alternativa:

È possibile ereditare i tuoi mirino da un BaseviewModel, che può avere una proprietà protetta returnURL. Imposta questo dove necessario.

Esempio:

sul tuo 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>
.

Sarebbe meglio gestirlo con azioni parziali che vengono visualizzate senza lasciare la pagina e utilizzando JQuery per creare un flusso di lavoro di dialogo / procedura guidata?

Quindi devi solo reagire al pulsante "Fine" nella finestra di dialogo per aggiornare la vista originale.

Per la parte della tua domanda riguardante il "salvataggio del record che stanno modificando", penso che il pattern post-redirect-get (PGR) si applichi a te.

Questo potrebbe essere un buon posto per leggerlo se non lo conosci.

  1. Codifica il returnUrl utilizzando Url.Encode(returnUrl) per l'inclusione nell'URL.
  2. Quando sei pronto per il reindirizzamento, utilizza Url.Decode(returnUrl) e utilizza il valore per il reindirizzamento effettivo.
Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top