2009-07-06 7 views
0

J'ai une page partagée dans mon application ASP.NET MVC qui peut être accessible à partir de plusieurs pages différentes dans mon application. Si je souhaite que l'utilisateur revienne à sa page d'origine une fois qu'il a fait son travail sur la page partagée, quel est le meilleur moyen de déterminer où se trouvait l'utilisateur et d'indiquer à l'application d'y accéder?Retour à la page d'appel à partir d'une page partagée

Notez que je fais actuellement ce pour le bouton Annuler sur la page partagée en disant onclick utiliser l'historique de la page:

<input type="button" value="Cancel" onclick="if (history.length == 0) { window.location='<%=Url.Action("Index", "Home") %>' } else { history.back() }" /> 

mais cela ne fonctionnera pas pour Save si les mises à jour de pages données partagées affiché sur la page d'origine.

Répondre

1

Deux façons que je peux penser est de stocker l'URL de la page d'appel dans un élément d'entrée caché ou comme argument dans l'adresse de la page en cours. Les deux survivront aux actualisations ou à plusieurs étapes de navigation, il vous suffit de vous assurer que les variables sont transmises à la page suivante.

2

essayer d'utiliser:

System.Web.HttpContext.Current.Request.UrlReferrer 

http://msdn.microsoft.com/en-us/library/system.web.httprequest.urlreferrer.aspx

+0

Cela ne fonctionnera pas si vous devez revenir en arrière plus d'une étape, c'est-à-dire que la sous-page redirige vers une nouvelle page pour la validation de formulaire ou qu'il y a plusieurs sous-pages à parcourir. –

+0

vous pouvez le stocker en session lorsque vous chargez la page pour la première fois. – Josh

0

Les problèmes de ce genre sont la raison pour laquelle je considère de plus en plus l'utilisation d'une classe BaseViewModel pour hériter de tous mes modèles de vue afin de stocker des informations utiles sur une page donnée. J'ai essayé de trouver une définition de classe complète ces derniers temps, mais à ces fins, il serait probablement agréable d'avoir les propriétés follwing (posté partie de ceci dans une réponse à une question différente, je vais trouver un lien dans un bit):

public class BaseModel 
{ 
    public string PageTitle { get; set; } 
    public string PageDescription { get; set; } 
    public string PageKeywords { get; set; } //maybe use a List<string> or string[] here 
    public string ReturnPage { get; set; } 
    //TBD: any other useful HTML page elements 
} 

Ensuite, je pourrais créer un modèle de vue qui hérite de ceci:

public class RandomViewModel : BaseViewModel 
{ 
    RandomViewModel() 
    { 
     //set page properties 
    } 
} 

Puis, dans une couche de service (de préférence) ou dans un contrôleur (peut avoir à faire là-bas, havre de paix N'a pas essayé cela donc ne peut pas être sûr) vous auriez accès à la propriété ReturnPage lors de la construction de votre modèle (dans cet exemple, je suppose que vous faites cela dans l'action):

public ActionResult RandomAction() 
{ 
    RandomViewModel model = _serviceLayer.GetRandomViewModel(); 
    model.ReturnPage = this.HttpContext.Request.UrlReferrer; 
    return View(model); 
} 

Puis dans la vue que vous seriez en mesure de le faire:

<input type="button" value="Cancel" onclick="if (history.length == 0) { window.location='<%= Model.ReturnPage %>' } else { history.back() }" /> 

C'est tout juste un peu de remue-méninges, mais je pense que cela fonctionnerait. Le seul gros problème dont je ne suis pas sûr est l'endroit où vous voudriez définir la valeur du referrer. J'essaierais aussi de sortir cet événement onclick de l'élément et de le placer dans l'en-tête si vous le pouvez.

Espérons que cela aide.

Questions connexes