2010-03-25 3 views
1

J'utilise TempData pour conserver ModelState pendant les redirections (en utilisant la technique MvcContrib). Cela fonctionne bien. Cependant, dans de rares cas, l'utilisateur interrompt la demande et en déclenche immédiatement une autre (par exemple, clique rapidement sur un autre élément de menu). Cela provoque des erreurs ModelState à apparaître sur cette page, à laquelle il n'appartient pas.ASP.NET MVC TempData utilisé pour une requête incorrecte

Le problème est que TempData est stocké dans Session. Cela signifie que TOUTES les demandes peuvent l'attraper, par ex. celui qui vient en premier au serveur.

Y a-t-il des solutions de contournement connues? Par exemple. Conservez la "page de destination" dans TempData avec ModelState enregistré.

Répondre

2

À mon avis TempData devrait seulement être utilisé dans les actions qui redirigent immédiatement. Par exemple:

public ActionResult Index() 
{ 
    TempData["foo"] = "bar"; 
    return RedirectToAction("About"); 
} 

public ActionResult About() 
{ 
    var foo = TempData["foo"]; 
    return View(); 
} 

Vous devez éviter de stocker quelque chose dans la TempData et de rendre une vue:

public ActionResult Index() 
{ 
    TempData["foo"] = "bar"; 
    // bad :-(
    return View("About"); 
} 

Utilisez session pour obtenir ce que vous cherchez ou ajouter une pièce d'identité unique qui vous permettra d'identifier la demande correcte

Une autre technique courante que vous pouvez utiliser au lieu de TempData est de serialize the model on the client (une sorte de ViewState si vous voulez).

+0

Ma question concerne exactement les "actions qui redirigent immédiatement". Problème ne se produirait pas si je rends juste la vue après l'attribution de tempdata. Et TempDate _DO_ utiliser Session donc ce conseil n'a aucun sens. Le problème est qu'il n'y a pas de "redirection immédiate" - une autre requête provoquée par un clic de l'utilisateur peut l'annuler et venir ensuite. Quant à sérialiser ModelState dans la vue, j'y ai pensé, mais merci pour le lien. – queen3

+0

Non, je ne peux pas sérialiser en vue. Le flux est "get POST - vérifier les erreurs - set ModelState - rediriger vers la page qui affiche les messages". Il n'y a pas de "vue" entre "vérifier les erreurs" et "page qui affiche des messages". – queen3

Questions connexes