c# - Comment rediriger vers Action dans ASP.NET MVC sans perdre les données de demande

Translate

En utilisant ASP.NET MVC, il existe des situations (telles que la soumission de formulaire) qui peuvent nécessiter unRedirectToAction.

Une telle situation est lorsque vous rencontrez des erreurs de validation après la soumission d'un formulaire et que vous devez rediriger vers le formulaire, mais que vous souhaitez que l'URL reflète l'URL du formulaire, et non la page d'action à laquelle il se soumet.

Comme j'ai besoin du formulaire pour contenir lePOSTdonnées, pour la commodité de l'utilisateur, ainsi qu'à des fins de validation, comment puis-je transmettre les données viaRedirectToAction()? Si j'utilise le paramètre viewData, monPOSTles paramètres seront modifiés enGETparamètres.

This question and all comments follow the "Attribution Required."

Toutes les réponses

Translate

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);
}
La source
Translate

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 ferais pas cela à moins que vous ne sachiez avec certitude (via la mesure et le profilage) que l'utilisation de l'état de session vous fait mal.

La source
Dan
Translate

Jeter un coup d'œil àMVCContrib, tu peux le faire:

using MvcContrib.Filters;

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

Il existe un autre moyen qui évite les données temp. Le modèle que j'aime consiste à créer une action pour le rendu d'origine et le rendu du formulaire invalide. 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 plus ou moins le modèle. Un petit pseudo-jouet. Avec cela, vous pouvez créer 1 vue pour gérer le rendu du formulaire, réafficher les valeurs (puisque le formulaire sera rempli avec les valeurs précédentes) et afficher les messages d'erreur.

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

J'essaye de rendre ce modèle facile dans leFramework de validation .netau fur et à mesure que nous développons le support de MVC.

La source
Translate

Si vous souhaitez transmettre des données à l'action redirigé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);
La source