web-dev-qa-db-fra.com

Dans ASP.NET MVC, comment fonctionne response.redirect?

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

29
Swoop

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);
}
46
JasonTrue

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);
}
20
Robert Harvey

Dans MVC, n'utilisez jamais Response.

return RedirectToAction("ActionResultName", "ControllerName");

Quant à POURQUOI pour NE PAS utiliser Response.Redirect dans MVC:

  1. Problèmes de performances avec elle
  2. Ne suit pas le modèle MVC asp.net standard et les conventions qui ont été conçues spécifiquement pour MVC.
10
Tom Stickel

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

2
adnan