Comment redirect Action dans ASP.NET MVC sans perdre les données de demande

À l’aide d’ASP.NET MVC, il existe des situations (telles que la soumission de formulaires) qui peuvent nécessiter une RedirectToAction .

Une de ces situations est lorsque vous rencontrez des erreurs de validation après une soumission de formulaire et que vous devez redirect vers le formulaire, mais souhaitez que l’URL reflète l’URL du formulaire, et non la page d’action à laquelle elle est soumise.

Comme je demande que le formulaire contienne les données à l’origine POST ed, à des fins de commodité et de validation, comment puis-je transmettre les données via RedirectToAction() ? Si j’utilise le paramètre viewData, mes parameters POST seront modifiés en parameters GET .

La solution consiste à utiliser la propriété TempData pour stocker les composants Request souhaités.

Par exemple:

 public ActionResult Send() { TempData["form"] = Request.Form; return this.RedirectToAction(a => a.Form()); } 

Ensuite, dans votre action “Formulaire”, vous pouvez aller:

 public ActionResult Form() { /* Declare viewData etc. */ if (TempData["form"] != null) { /* Cast TempData["form"] to System.Collections.Specialized.NameValueCollection and use it */ } return View("Form", viewData); } 

Gardez à l’esprit que TempData stocke la collection de formulaires en session. Si vous n’aimez pas ce comportement, vous pouvez implémenter la nouvelle interface ITempDataProvider et utiliser un autre mécanisme pour stocker les données temporaires. Je ne le ferais pas à moins que vous ne le sachiez (via la mesure et le profilage) que l’utilisation de l’état de session vous blesse.

Jetez un oeil à MVCConsortingb , vous pouvez le faire:

 using MvcConsortingb.Filters; [ModelStateToTempData] public class MyController : Controller { // ... } 

Il y a un autre moyen qui évite tempdata. Le modèle que j’aime implique la création d’une action pour le rendu d’origine et le rendu de la forme non valide. Ca fait plutot comme ca:

 var form = new FooForm(); if (request.UrlReferrer == request.Url) { // Fill form with previous request's data } if (Request.IsPost()) { if (!form.IsValid) { ViewData["ValidationErrors"] = ... } else { // update model model.something = foo.something; // handoff to post update action return RedirectToAction("ModelUpdated", ... etc); } } // By default render 1 view until form is a valid post ViewData["Form"] = form; return View(); 

C’est le modèle plus ou moins. Un petit pseudo. Avec cela, vous pouvez créer une vue pour gérer le rendu du formulaire, afficher à nouveau les valeurs (puisque le formulaire sera rempli avec les valeurs précédentes) et afficher les messages d’erreur.

Lors de la publication dans cette action, si elle est valide, elle transfère le contrôle à une autre action.

J’essaie de simplifier ce modèle dans le cadre de validation de .net lorsque nous construisons la prise en charge de MVC.

Si vous souhaitez transmettre des données à l’action redirigée, la méthode que vous pouvez utiliser est la suivante:

 return RedirectToAction("ModelUpdated", new {id = 1}); // The definition of the action method like public ActionResult ModelUpdated(int id);