2009-07-08 8 views
0

J'ai une section de mon site où les utilisateurs peuvent ajouter des adresses à leur compte. Ils peuvent en ajouter autant qu'ils en ont besoin (expédition, facturation, etc.)..NET MVC Plusieurs versions de même formulaire sur One View

Je configure les choses de sorte qu'après l'ajout d'une adresse, les utilisateurs voient l'adresse dans un formulaire de mise à jour avec un bouton «enregistrer» et «supprimer». L'utilisateur peut ajuster l'une des adresses qu'ils ont ajoutées.

Le problème que j'ai est avec la validation. Disons que la ligne 1 est requise. Si je mets à jour la deuxième des trois adresses et laisse la ligne 1 vide, le contrôleur déclenche une erreur (en utilisant la même technique de Nerd Dinner, BTW). C'est bon. Ce qui est mauvais, c'est que toutes les informations d'adresse sur toutes les adresses listées dans la vue, montrent maintenant comme valeurs de l'adresse où l'erreur a été soulevée.

Je sais que cela a quelque chose à voir avec le modèle contraignant, mais je suis confus, car les données de formulaire est définie comme suit:

<%= Html.TextBox("Line1", Model.Address.Line1)%> 

Le modèle qui est transmis est unique à l'adresse que nous sommes dans la liste des adresses des clients. Je ne suis pas sûr pourquoi la valeur dans "Model.Addres.Line1" est remplacée par des données dans la collection ModelState ModelErrors. Je suppose que le comportement par défaut consiste à utiliser les valeurs de la collection d'erreurs lorsqu'elles sont présentes. Ceci est un problème lorsqu'il existe plusieurs formulaires dans la vue et que le formulaire utilise les mêmes noms pour les champs de saisie que chacun des autres formulaires.

Est-ce que mon seul moyen de contourner ici la fonction Html Helper et de coder en dur les entrées en HTML?

Répondre

0

Corrigez-moi si vous avez tort, mais il semble que les 3 adresses auront les mêmes noms de champs dans le même formulaire? Si c'est le cas, vous avez des problèmes plus importants que le simple message de validation.

Peu importe (même si vous utilisez des formulaires séparés), je vous suggère de préfacer les noms de champs avec l'ID d'adresse:

<%= Html.TextBox("Address" + Model.Address.ID + ".Line1", Model.Address.Line1)%> 

Vous ne serez pas capable de se lier automatiquement (dans les paramètres de la méthode), mais vous pouvez utiliser UpdateModel() et définir le préfixe à

"Address" + Address.ID 
+0

Il existe un formulaire distinct pour chacune des adresses. Si je préface le nom de champ avec l'ID unique, alors je perds la liaison de modèle que je veux pour les mises à jour dans le contrôleur. BTW, lorsqu'il n'y a pas d'erreurs de validation, les mises à jour sont réussies. Je ne rencontre des problèmes que lorsque des erreurs se produisent. – mikerennick

+0

Oui, vous perdez la liaison automatique du modèle. Si vous voulez garder cela, vous devez avoir trois liaisons de modèle (dont 2 seront toujours nulles) - il y a aussi une option de préfixe pour les liaisons. Vous pouvez également faire deux choses: a) Afficher uniquement le message validationMessage() pour le formulaire soumis. N'appelez pas validationMessage() pour les adresses qui n'ont pas été soumises. La vue sera un peu brouillon, cependant. b) Conservez le Html.TextBox() de la même manière, mais ajoutez les préfixes uniquement à ValidationMessage(). Faites quelque chose dans votre contrôleur pour renommer les erreurs de validation dans viewstate. Aussi désordonné. –

0

Je résolu ce problème en se débarrassant des méthodes d'aide HTML sur la forme (s). Si quelqu'un voit un moyen de garder les méthodes d'aide s'il vous plaît faites le moi savoir.

+0

Juste vu que le poste ci-dessus a été mis à jour avec une solution. Je n'étais pas au courant de l'option prefix sur la méthode UpdateModel. Merci. – mikerennick

Questions connexes