2010-09-23 6 views
1

J'expérimente différentes combinaisons de modèles de vue fortement typés, de vues complètes et de vues partielles, en utilisant à la fois RenderPartial() et RenderAction(). Le scénario post-formateur que je pose, cependant, est celui qui vient de la vue "principale" - une vue qui n'est pas partielle. Le contrôleur de cette vue principale construit le modèle de vue qui fournit les vues partielles avec leurs modèles.Action ASP.NET MVC [HttpPost] accepte un objet unique, renvoie les erreurs de validation à ViewPage <CustomViewModel>

Le [HttpPost] action est également dans le contrôleur principal et accepte un seul objet:

[HttpPost] 
    public ActionResult Edit([Bind(Prefix="Book")]Book book) 

Lorsque le ModelState est valide et la mise à jour est réussie, j'utiliser un RedirectToAction(), qui est Tout va bien.

Quand il y a des erreurs dans le ModelState, cependant, je tente de:

Return View(book); 

-et la vue, bien sûr, attend l'objet modèle de vue « principale » qui contient toutes sortes d'autres objets et Sélectionnez Listes, etc., qui est le problème.

Dans ce cas, les utilisateurs utilisent-ils l'ensemble de l'objet de modèle de vue comme paramètre de leur action [HttpPost], afin qu'ils puissent le renvoyer en cas d'erreur? Je sais que cela ne peut pas être juste, mais je pense plutôt qu'il existe une solution plus facile que je ne connais pas.

Répondre

0

Un modèle commun à prendre en compte est PRG ou Post-Redirect-Get.

Si la validation échoue, rediriger vers l'action Get originale, si la validation réussit, OBTENEZ votre page suivante dans la séquence.

  1. HTTP GET "/ produits/créer", "Créer" vue est rendue
  2. HTTP POST "/ produits/soumettre"
  3. validation échoue, redirigent à "/ produits/créer", " Créer » vue est rendue
  4. HTTP POST «/produits/soumettre »
  5. article est créé, redirigent à «/produits/confirmer », « Confirmer » vue est rendue
+0

Dans ce cas, je recréer le "principal" entier vi EW modèle à l'étape 3, et transmettre les erreurs dans TempData? – asfsadf

+0

Vous avez 2 choix. Remplissez TempData avec vos erreurs, puis appelez RedirectToAction (ActionName) où il s'agit de l'action GET d'origine qui affiche la page et remplit probablement le modèle de vue de manière appropriée. Un problème avec cette méthode est que les valeurs 'invalides' de l'utilisateur seront perdues et les données originales seront affichées sur la page (ce qui peut parfois être acceptable). L'alternative est de (malheureusement) repeupler le modèle entier, et les erreurs et réafficher la page. Si cette approche introduit la répétition, extrayez le code remplissant le modèle dans une fonction réutilisable. – Clicktricity

+0

Je vois. Merci pour l'explication. – asfsadf