2008-11-26 5 views
4

j'utilise MVC pour valider certaines zones de texte HTML sur une page, par exemple dans mon contrôleur il y avalidation ASP.NET MVC et des vues

 if (String.IsNullOrEmpty(name)) 
     { 
      ModelState.AddModelError("name", "You must specify a name."); 
     } 


     if (ViewData.ModelState.IsValid) 
     { 
      return RedirectToAction("Index"); 
     } 

retour View(); Le problème est ici, si la validation échoue, il échoue renvoyer View ("Add") raison pour laquelle les contrôleurs ne traitent pas les vues sur return view(), une option serait d'utiliser RedirectToView ("viewname"); et cela fonctionnera bien SAUF cela ne porte pas à travers la validation AddModelError stuff ("c'est comme si le chargement de la page pour la première fois").

Je peux contourner ce problème en répétant le code pour remplir les zones SelectList avant le retour View();

comme celui-ci

 ViewData["rooms"] = new SelectList(Villa.intList(10)); 
     ViewData["sleeps"] = new SelectList(Villa.intList(20)); 
     ViewData["accomodationType"] = new SelectList(accomodationList, "accomodationId", "accomodationType"); 
     ViewData["regionName"] = new SelectList(regionList, "regionId", "regionName"); 
     return View(); 

qui fonctionne très bien, mais je pense qu'il ya une meilleure façon plutôt que de répéter ce bloc de code, personne ne sait aucune façon de retourner une vue redirigée et passer les erreurs de modèle ?

Merci d'avance, j'espère que cela a eu un sens.

Répondre

4

Prenez le code que vous avez pour initialiser le ViewData dans le (GET) Ajouter une action et refactoriser (méthode d'extraction) dans un autonome, privé méthode. Appelez cette méthode depuis votre action (GET) Ajouter. Maintenant dans l'action POST (qui est, je présume, ce que vous montrez ci-dessus, ce n'est pas clair), vous pouvez appeler la même méthode privée pour peupler ViewData. Maintenant, vous n'avez plus de code dupliqué. Souvenez-vous que ViewData est une propriété du type Controller, vous pouvez donc le définir n'importe où, pas seulement dans la méthode d'action elle-même.

+0

Non testé pour l'instant, mais il est logique, ne savais pas que vous pouviez le faire en dehors d'une méthode ActionResult! Merci – Tablet

0

Je dois admettre que j'ai une certaine confusion à suivre exactement ce que vous voulez dire, donc c'est une sorte de réponse générique qui pourrait ne pas être exacte!

http://weblogs.asp.net/scottgu/archive/2008/09/02/asp-net-mvc-preview-5-and-form-posting-scenarios.aspx

Ceci est une bonne lecture.

Je peux penser à deux façons.

Pour modifier la plus petite quantité de code, il suffit de mettre votre ViewData dans TempData et après la redirection récupérer.

La réponse probablement la plus acceptée est d'utiliser la méthode décrite dans le lien ci-dessus. Demandez à votre formulaire de revenir à la même action. Cette action aura deux implémentations - un poste et un Get. Dans l'action Publier, faites toute la logique de validation. Si la validation fonctionne, effectuez une action de redirection vers la vue affichée en cas de succès (modèle Post-Redirect-Get). Si la validation échoue, réaffiche la même vue du formulaire avec les erreurs de validation affichées.

Si ce n'est pas ce que vous demandez, laissez-moi savoir ~