J'utilise MVC 3 dans mon projet et je constate un comportement très étrange.
J'essaie de créer un champ caché pour une valeur particulière sur mon modèle, le problème est que, pour une raison quelconque, la valeur définie sur le champ ne correspond pas à la valeur dans le modèle.
par exemple
J'ai ce code, juste comme test:
<%:Html.Hidden("Step2", Model.Step) %>
<%:Html.HiddenFor(m => m.Step) %>
Je pense que les deux champs cachés auraient la même valeur. Ce que je fais est de définir la valeur sur 1 la première fois que j'affiche la vue, puis après la soumission, j'augmente la valeur du champ Modèle de 1.
Ainsi, la première fois que je rend la page, les deux contrôles ont la valeur 1, mais la deuxième fois, les valeurs rendues sont les suivantes:
<input id="Step2" name="Step2" type="hidden" value="2" />
<input id="Step" name="Step" type="hidden" value="1" />
Comme vous pouvez le voir, la première valeur est correcte, mais la deuxième valeur semble être la même que la première fois que j'affiche la vue.
Qu'est-ce que je rate? Les helpers * For Html mettent-ils en cache les valeurs d'une manière ou d'une autre? Si tel est le cas, comment puis-je désactiver cette mise en cache?.
Merci de votre aide.
Réponses:
C'est normal et c'est ainsi que fonctionnent les helpers HTML. Ils utilisent d'abord la valeur de la requête POST et ensuite la valeur du modèle. Cela signifie que même si vous modifiez la valeur du modèle dans l'action de votre contrôleur s'il y a la même variable dans la requête POST, votre modification sera ignorée et la valeur POSTed sera utilisée.
Une solution de contournement possible consiste à supprimer cette valeur de l'état du modèle dans l'action du contrôleur qui tente de modifier la valeur:
Une autre possibilité est d'écrire un assistant HTML personnalisé qui utilisera toujours la valeur du modèle et ignorera les valeurs POST.
Et encore une autre possibilité:
la source
J'ai rencontré le même problème lors de l'écriture d'un assistant qui montre différentes parties d'un modèle plus grand à chaque étape.
Les données et / ou les erreurs de «l'étape 1» deviendraient mélangées avec «l'étape 2», etc., jusqu'à ce que je réalise enfin que ModelState était à «blâmer».
C'était ma solution simple:
la source
ModelState.Clear()
a résolu mon problème avec les demandes POST séquentielles dans une situation similaire.Ce code ne fonctionnera pas
... parce que HiddenFor lit toujours (!) depuis ModelState pas le modèle lui-même. Et s'il ne trouve pas la clé "Step", il produira la valeur par défaut pour ce type de variable qui sera 0 dans ce cas
Voici la solution. Je l'ai écrit pour moi, mais cela ne me dérange pas de le partager car je vois que beaucoup de gens ont du mal avec cette vilaine aide de HiddenFor.
Ensuite, vous l'utilisez comme d'habitude depuis votre vue:
Il convient de mentionner que cela fonctionne également avec les collections.
la source
Je suis trop aux prises avec la même situation que je pense, où j'utilise le même état de modèle entre les appels et lorsque je modifie une propriété de modèle sur le backend. Cependant, cela n'a pas d'importance pour moi, si j'utilise textboxfor ou hiddenfor.
Je contourne simplement la situation en utilisant des scripts de page pour stocker la valeur du modèle en tant que variable js, car j'ai besoin du champ caché à cette fin au début.
Je ne sais pas si cela aide, mais considérez simplement ...
la source