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.
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. –
vous pouvez le stocker en session lorsque vous chargez la page pour la première fois. – Josh