Comment RedirectToAction dans ASP.NET MVC sans perdre les données de la demande

StackOverflow https://stackoverflow.com/questions/1936

  •  08-06-2019
  •  | 
  •  

Question

À l'aide de ASP.NET MVC il y a des situations (telles que la soumission du formulaire) qui peuvent nécessiter une RedirectToAction.

Une telle situation est lorsque vous rencontrez des erreurs de validation après la soumission du formulaire et de la nécessité de rediriger vers le formulaire, mais nous voudrions que la URL pour refléter l'URL de la forme, pas la page d'action, il se soumet à.

Comme j'ai besoin de la forme de contenir à l'origine de la POSTed de données, pour la commodité de l'utilisateur, ainsi que des fins de validation, comment puis-je transmettre les données par le biais de la RedirectToAction()?Si j'utilise le viewData paramètre, mon POST les paramètres seront modifiés pour GET les paramètres.

Était-ce utile?

La solution

La solution est d'utiliser la TempData propriété pour stocker la Demande de composants.

Par exemple:

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

Ensuite, dans votre "Forme" de l'action, 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);
}

Autres conseils

Gardez à l'esprit que TempData des magasins de la collection de formulaire dans la session.Si vous n'aimez pas ce comportement, vous pouvez mettre en œuvre la nouvelle ITempDataProvider interface et utiliser un autre mécanisme pour stocker des données temporaires.Je ne le ferais pas, sauf si vous savez pour un fait (par l'intermédiaire de la mesure et de profilage) que l'utilisation de l'état de Session est de vous faire mal.

Jetez un oeil à MVCContrib, vous pouvez faire ceci:

using MvcContrib.Filters;

[ModelStateToTempData]
public class MyController : Controller {
    //
    ...
}

Il est un autre moyen qui évite tempdata.Le modèle que j'ai comme l'implique la création de 1 action pour le rendu d'origine et re-rendu du formulaire non valide.Il va quelque chose comme ceci:

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 peu pseudoy.Avec cela, vous pouvez créer 1 vue de gérer le rendu de la forme, de la ré-affichage des valeurs (depuis le formulaire sera rempli avec les valeurs précédentes), et affiche les messages d'erreur.

Lors de l'affichage de cette action, si la validité de son il cède le contrôle à une autre action.

Je suis en train de faire de ce modèle facile dans la .net framework de validation comme nous l'avons construire soutien de la MVC.

Si vous souhaitez transmettre des données à la redirection de l'action, la méthode que vous pouvez utiliser est:

return RedirectToAction("ModelUpdated", new {id = 1});
// The definition of the action method like  public ActionResult ModelUpdated(int id);
Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top