J'ai les deux méthodes d'action suivantes (simplifiées pour la question) :
[HttpGet]
public ActionResult Create(string uniqueUri)
{
// get some stuff based on uniqueuri, set in ViewData.
return View();
}
[HttpPost]
public ActionResult Create(Review review)
{
// validate review
if (validatedOk)
{
return RedirectToAction("Details", new { postId = review.PostId});
}
else
{
ModelState.AddModelError("ReviewErrors", "some error occured");
return RedirectToAction("Create", new { uniqueUri = Request.RequestContext.RouteData.Values["uniqueUri"]});
}
}
Ainsi, si la validation passe, je redirige vers une autre page (confirmation).
Si une erreur se produit, je dois afficher la même page avec l'erreur.
Si je le fais return View()
l'erreur est affichée, mais si je fais return RedirectToAction
(comme ci-dessus), il perd les erreurs de modèle.
Je ne suis pas surpris par ce problème, mais je me demande comment vous gérez ça.
Je pourrais bien sûr simplement renvoyer la même vue au lieu de la redirection, mais j'ai une logique dans la méthode "Create" qui alimente les données de la vue, que je devrais dupliquer.
Des suggestions ?
10 votes
Je résous ce problème en n'utilisant pas le motif Post-Redirect-Get pour les erreurs de validation. J'utilise simplement View(). C'est parfaitement valable de faire cela au lieu de sauter à travers un tas de cerceaux - et la redirection gâche l'historique de votre navigateur.
2 votes
Et en plus de ce qu'a dit @JimmyBogard, extrayez la logique dans les
Create
qui remplit les ViewData et l'appelle dans la méthodeCreate
GET et également dans la branche de validation échouée dans le fichierCreate
Méthode POST.1 votes
Je suis d'accord, éviter le problème est une façon de le résoudre. J'ai une logique qui permet de remplir des éléments dans mon fichier
Create
je l'ai juste mis dans une méthodepopulateStuff
que j'appelle dans les deuxGET
et l'échecPOST
.13 votes
@JimmyBogard Je ne suis pas d'accord, si vous envoyez un message à une action et que vous renvoyez ensuite la vue, vous rencontrez le problème suivant : si l'utilisateur appuie sur le bouton de rafraîchissement, il reçoit un avertissement lui indiquant qu'il doit à nouveau envoyer ce message.