2011-10-10 2 views
1

J'ai un problème en changeant la valeur d'une zone de texte dans MVC 3.Impossible de modifier la valeur d'une zone de texte dans ASP.NET MVC 3

J'ai une vue simple qui est renvoyée par un contrôleur et est tapé sur un modèle de vue personnalisé. Une zone de texte sur la vue est liée à une propriété de chaîne sur le modèle de vue. Si je remplis cette chaîne lors du chargement initial, la valeur de la zone de texte contient la valeur de la chaîne. Toutefois, si je renvoie ensuite un formulaire à la même URL et modifie la valeur de chaîne de modèle de vue et recharger la vue, la zone de texte contient la valeur qui a été renvoyée, pas la valeur fournie par le contrôleur pour le modèle de vue. J'ai créé un projet de test simple pour recréer le problème de la manière la plus simple possible.

Voir Modèle:
http://www.codetunnel.com/content/images/textboxproblem/ViewModel.jpg

Controller:
http://www.codetunnel.com/content/images/textboxproblem/Controller.jpg

Vue:
http://www.codetunnel.com/content/images/textboxproblem/View.jpg

Dans la vue j'afficher la valeur de chaîne de modèle de vue et je lie également la propriété de chaîne à une zone de texte.

Sur initial, tout charge semble bien:
http://www.codetunnel.com/content/images/textboxproblem/InitialLoadTest.jpg

Cependant, si je change la valeur de la zone de texte, puis appuyez sur Entrée pour afficher les choses de forme ne se produisent pas comme je m'y attendais. La valeur affichée est la valeur du régulateur situé dans la méthode d'action, mais la zone de texte conserve la valeur qui a été réaffecté:
http://www.codetunnel.com/content/images/textboxproblem/POSTTest.jpg

Je ne sais pas quel est le problème. Toute idée est appréciée.

Répondre

1

C'est (malheureusement) le comportement correct. Lorsque vous utilisez TextBoxFor ou d'autres éléments liés aux données, l'élément créé est d'abord lié au ModelState existant, avant d'être lié au modèle.

La solution consiste à effacer ModelState dans votre action [HttpPost], afin que les éléments de la vue renvoyée par l'action POST soient liés au modèle. Dans votre action POST, ajoutez ce qui suit:

ModelState.Clear(); 

Personnellement, je pense que la conception est erronée, mais la compensation ModelState vous donnera le comportement que vous attendiez.

+0

Merci pour cela. Je ne peux pas croire que je n'ai pas pensé à ModelState puisque c'est ainsi que fonctionne la validation quand elle affiche des valeurs. Merci counsellorben. – Chev

+0

De rien. C'est juste quelque chose qui peut être mystifiant, car il semble d'abord se lier à ModelState.Puisque le modèle étant passé est l'intention la plus récente du développeur, vous vous attendez à ce que ce soit le premier. C'est la vie. – counsellorben

+0

Un aperçu de pourquoi c'est? J'ai déjà vécu cela dans le passé et c'est, comme vous le dites, une erreur. Je ne peux que supposer qu'ils avaient une bonne raison de le faire .. – egoodberry

0

C'est le comportement attendu d'une application MVC.

Lorsque vous créez un post, il a enregistré la valeur dans ModelState et les helpers Html utilisent cette valeur au lieu de la valeur Model.

Vous pouvez écrire votre propre assistant html ou utiliser un code html standard <input/> pour contourner ce problème si nécessaire.

Questions connexes