2011-07-25 7 views
2

J'ai une question à propos de ASP .Net MVC. I J'ai un formulaire d'inscription par email dans ma page principale (barre d'outils), il y a un champ de texte pour l'email et un bouton qui envoie l'email à mon Home Controller. Le problème que j'ai est que si je navigue vers une page dans un contrôleur différent et je clique sur soumettre pour soumettre mon email et si cet email a des erreurs alors j'ajoute une erreur à ModelState.Errors et puis redirige vers l'original Page (J'ai la page d'origine dans un champ caché dans mon formulaire, donc je sais où rediriger), car vous avez déjà remarqué que l'erreur est perdue parce que dans l'autre contrôleur nous avons un ModelState complètement différent.Erreurs persistantes entre les contrôleurs

S'il n'y a pas d'erreurs, l'e-mail est enregistré et l'utilisateur est renvoyé vers une page complétée avec succès. J'ai d'abord pensé que je pouvais enregistrer les erreurs dans TempData et ensuite vérifier s'il avait une valeur quelque part dans un classeur d'action ou une classe de contrôleur de base et l'ajouter au nouveau Controller ModelState.

Je voudrais savoir s'il existe d'autres moyens ou de meilleurs moyens ou même si l'envoi d'une erreur dans TempData est une bonne pratique.

Merci.

Répondre

1

Le schéma habituel d'une action POST est la suivante:

[HttpPost] 
public ActionResult Foo(MyModel model) 
{ 
    if (!ModelState.IsValid) 
    { 
     // if there were some validation errors redisplay the form so that 
     // the user can fix them 
     return View(model); 
    } 

    // At this stage we know that the model is valid => we may try do some 
    // processing on it: 
    if (!Repository.TryDoSomeProcessing(model)) 
    { 
     // Something wen wrong with our processing => redisplay the form 
     // to inform the user of this 
     ModelState.AddModelError("foo", "bar"); 
     return View(model); 
    } 

    // at this stage we know that the processing succeeded => we may redirect 
    // there will no longer be error messages. We could at maximum use TempData 
    // to store some success message: 
    TempData["message"] = "Thank you for submitting!"; 
    return RedirectToAction("Success"); 
} 

Bien sûr, si vous ne respectez pas ce modèle et souhaitez rediriger des erreurs persistantes, etc ... vous êtes sur votre propre. J'ai vu des gens aux prises avec TempData, Sessions, Cache, ... à des erreurs persistantes entre les redirections. Je préfère laisser ces techniques sans commentaire.

+0

Merci, je devrais probablement utiliser Ajax et sauver les tracas alors!? – Raha

+0

@Raha, oui, AJAX pourrait sauver beaucoup de tracas. –

0

J'ai eu beaucoup de succès en utilisant TempData pour enregistrer le ModelState entre les redirections, et je le recommande absolument!

Le projet MvcContrib dispose d'une bonne assistance qui facilite l'enregistrement et la restauration de ModelState en TempData à l'aide de filtres d'action.

Cependant, pour nos projets nous voulions un contrôle manuel, nous avons donc créé des méthodes d'extensions pour TempData afin que nous puissions utiliser le code suivant:

TempData.SaveModelState(ModelState); 
return Redirect...; 

Et pour restaurer:

TempData.RestoreModelState(ModelState); 

De cette façon , notre site ne rend jamais une vue à partir d'un POST invalide, il redirige toujours vers un GET.

Questions connexes