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

voix
115

En utilisant ASP.NET MVC (il y a des situations telles que la soumission de formulaire) qui peuvent nécessiter un RedirectToAction.

Une telle situation est quand vous rencontrez des erreurs de validation après une soumission de formulaire et que vous devez rediriger la forme, mais souhaitez l'URL pour refléter l'URL de la forme, et non pas la page d'action qu'elle soumet.

Comme je l' ai besoin de la forme pour contenir les initialement POSTdonnées ETV, pour la facilité d'utilisation, ainsi que des fins de validation, comment puis - je transmettre les données à travers le RedirectToAction()? Si j'utilise le paramètre vidéotex, mes POSTparamètres seront modifiés pour les GETparamètres.

Créé 05/08/2008 à 06:33
source utilisateur
Dans d'autres langues...                            


5 réponses

voix
76

La solution est d'utiliser la propriété TempData pour stocker les composants de demande désirés.

Par exemple:

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

Ensuite, dans votre action « Form » 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);
}
Créé 05/08/2008 à 06:43
source utilisateur

voix
36

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

Créé 07/08/2008 à 06:12
source utilisateur

voix
13

Jetez un oeil à MvcContrib , vous pouvez le faire:

using MvcContrib.Filters;

[ModelStateToTempData]
public class MyController : Controller {
    //
    ...
}
Créé 05/04/2009 à 10:36
source utilisateur

voix
8

Il y a une autre façon qui évite TempData. Le motif I aime implique la création d'une action pour à la fois l'original et de rendre un nouveau 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 peu pseudoy. Avec cela, vous pouvez créer 1 en vue de gérer le rendu, la forme ré-affichage des valeurs (puisque le formulaire sera rempli de valeurs précédentes), et affiche les messages d'erreur.

Lorsque l'affichage à cette action, si elle valide, il transfère le contrôle à une autre action.

Je suis en train de faire ce modèle facile dans le cadre de la validation de .net alors que nous aménageons support pour MVC.

Créé 25/08/2008 à 23:06
source utilisateur

voix
2

Si vous voulez transmettre des données à l'action réorientée, 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);
Créé 30/11/2013 à 09:39
source utilisateur

Cookies help us deliver our services. By using our services, you agree to our use of cookies. Learn more