Question

Un problème que je me présente encore et encore consiste à gérer la redirection vers la page précédente après qu'un utilisateur exécute une action telle que cliquer sur un lien `` retour à ... '' ou enregistrer l'enregistrement qu'ils modifient.

Auparavant, chaque fois que j'avais besoin de savoir à quelle page retourner, je fournirais un returnURL paramètre à ma vue actuelle.

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

Ce n'est pas un moyen très propre de gérer cette situation, car parfois l'URL de retour contient des paramètres tels que les chaînes de recherche, etc., qui doivent être incluses dans l'URL.

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

De plus, cela crée un problème lorsqu'un utilisateur peut faire avancer une autre page avant de revenir à la page avec le returnURL Parce que tu dois passer le returnURL à travers toutes les pages visitées.

Le simple fait d'appeler la fonctionnalité de dos du navigateur n'est pas vraiment suffisant non plus, car vous voudrez peut-être que la page se rafraîchisse, par exemple, les modifications que vous venez d'enregistrer dans la page précédente.

Ma question est donc: quelqu'un a-t-il trouvé un moyen intelligent de gérer ce type de situation, en particulier dans un environnement MVC?

Noter: J'utilise ASP .NET MVC, donc si possible j'aimerais des réponses à cela, mais toutes les idées sont les bienvenues.

Était-ce utile?

La solution

Quel est le problème avec la définition d'un cookie ou l'utilisation d'une variable de session? La seule raison pour laquelle vous ne le feriez pas, c'est si vous ne contrôlez pas la page qui vous appelle, auquel cas vos seules options sont des chaînes de requête, des valeurs de poste ou un référent.

Autres conseils

J'ai pensé que je pourrais ajouter ma réponse à la question pour voir si les autres pensent que c'est une bonne idée.

Je le passe simplement au contrôleur en utilisant TempViewData:

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

puis y accéder de manière similaire à cela (dans ma vraie version, je vérifie que la clé est dans TempData Et que le returnURL est une véritable URL):

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

S'il doit se poursuivre sur le passé le premier changement de page (IE Page de recherche -> Modifier la page -> Modifier la page de la section) Je l'ajoute à nouveau

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

Consultez mon article de blog à ce sujet: Utilisation des cookies pour contrôler la page de retour après la connexion sur ASP.NET MVC 3

Tout comme @Mystere Man mentionné, vous pouvez simplement utiliser un cookie ou une session pour cela. Je suis allé chercher des cookies quand j'avais une situation similaire il y a quelque temps.

Essayez d'enregistrer un nouvel itinéraire dont est l'URL /{controller}/{action}/{id}/returnurl/{*url} puis utilisez un RedirectToAction dans l'action qui accepte URL comme paramètre

Request.UrlReferrer.AbsoluteUri

Bien que je dirais toujours que vous ne devriez pas créer votre propre bouton "arrière".

Utilisez un intercepteur ou un aspect:

  1. Intercepter chaque demande d'une certaine manière (par exemple, un @Before aspect) et enregistrez l'URL demandée à la session, en la écrasant à chaque fois
  2. Dans votre calque de vue, accédez à cet objet de session au besoin, dans votre cas pour le lien arrière.

Ce type de conception vous permet de toujours avoir la demande la plus récente disponible si vous souhaitez l'utiliser. Voici un exemple Pour écrire un aspect / intercepteur dans .NET. En plus, Post-sharp est un projet d'aspect .NET.

À l'heure actuelle, une méthode rapide et sale m'a échappé ... donc j'utilise une méthode pratique.

Au niveau conceptuel, la «back-rythme» d'une page doit être déterminée par la page sur laquelle vous êtes actuellement. La vue peut déduire cela (dans la plupart des cas) si les paramètres capturés dans le contrôleur y sont transmis via le ViewModel.

Exemple:

Avoir visité Foo, Je vais Bar Pour afficher certaines choses, et le bouton arrière doit revenir à Foo.

Manette

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

Voir (partiel) // No pun intended... or maybe it was. :)

Votre barview peut désormais interpréter à partir de son modèle où il doit revenir (en utilisant fooId).

Sur votre barview (en utilisant la syntaxe MVC2):

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

Vous pouvez également utiliser html.actionLink.

Alternativement:

Vous pouvez hériter de vos anciens de vue à partir d'un BaseViewModel, qui peut avoir une propriété protégée returnURL. Réglez ce si nécessaire.

Exemple:

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

En vue:

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

Serait-ce mieux géré par des actions partielles qui s'affichent sans quitter la page et utiliser jQuery pour créer un flux de travail de dialogue / assistant?

Ensuite, il vous suffit de réagir au bouton «finir» dans la boîte de dialogue pour actualiser la vue d'origine.

Pour la partie de votre question concernant "Sauver le dossier qu'ils éditent", je pense que le modèle post-redirect-get (PGR) s'appliquerait à vous.

C'est peut-être un bon endroit pour lire à ce sujet si vous ne le connaissez pas.

  1. Encoder le retoururl en utilisant Url.Encode(returnUrl) pour l'inclusion dans l'URL.
  2. Lorsque vous êtes prêt à rediriger, utilisez Url.Decode(returnUrl) et utilisez la valeur pour la redirection réelle.
Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top