J'ai utilisé response.redirect dans le classique ASP et les formulaires Web ASP.NET. Cependant, avec MVC 2.0, je rencontre quelque chose de particulier.
J'ai une méthode privée dans une classe de contrôleur qui est utilisée par plusieurs méthodes de contrôleur pour aider à charger et valider certaines informations. Cette méthode privée est configurée pour rediriger si un problème est découvert vers une page de message d'erreur générique.
Le gros problème que je remarque est que la classe de contrôleur appelant et la vue de page tentent de terminer le rendu et le chargement avant que la redirection n'ait réellement lieu. C'est ennuyeux en développement car la vue lève des exceptions que je dois ignorer avant que ma page d'erreur générique ne se charge enfin.
Comme mentionné ci-dessus, je suis habitué à l'ancien modèle de response.redirect qui empêchait l'exécution du code suivant sur une page car la nouvelle page se chargerait alors.
Toute aide ou conseil sur les redirections dans MVC serait grandement apprécié.
Le mécanisme conventionnel de redirection dans ASP.Net MVC consiste à renvoyer un objet de type RedirectResult au client. Si cela est fait avant l'appel de votre méthode View, vos méthodes d'affichage ne seront jamais appelées.
Si vous appelez Response.Redirect vous-même, au lieu de laisser le contrôleur frontal d'Asp.Net MVC le faire pour vous, votre méthode de contrôleur continuera jusqu'à ce qu'elle se termine ou lève une exception.
La solution idiomatique pour votre problème est que votre méthode privée renvoie un résultat que votre contrôleur peut utiliser.
par exemple:
public ActionResult Edit(MyEntity entity)
{
if (!IsValid()) return Redirect("/oops/");
...
return View();
}
private bool IsValid()
{
if (Nozzle==NozzleState.Closed) return false;
if (!hoseAttached) return false;
return (userRole==Role.Gardener);
}
Dans ASP.NET MVC, vous redirigez normalement vers une autre page en renvoyant un RedirectResult
à partir de la méthode du contrôleur.
Exemple:
public ActionResult Details(int id)
{
// Attempt to get record from database
var details = dataContext.GetDetails(id);
// Does requested record exist?
if (details == null)
{
// Does not exist - display index so user can choose
return RedirectToAction("Index");
}
// Display details as usual
return View(details);
}
Dans MVC, n'utilisez jamais Response.
return RedirectToAction("ActionResultName", "ControllerName");
Quant à POURQUOI pour NE PAS utiliser Response.Redirect dans MVC:
il est recommandé et c'est le seul moyen de rediriger vers le formulaire asp.net dans l'action du contrôleur mvc en utilisant
return Redirect("/page/pagename.aspx");
d'une autre manière, nous pouvons rediriger en utilisant (non recommandé et mauvaise façon)
Response.Redirect("/page/pagename.aspx", true);
cela fonctionnera pour la redirection, mais le problème est qu'il effacera toutes nos valeurs de session. alors pourquoi ce n'est pas recommandé.