Ce comportement me fait m'interroger sur ma santé mentale ..
J'ai une forme qui a deux endroits qui acceptent l'entrée, appelons-les en valeur et à la Valueb. L'utilisateur peut entrer une valeur dans l'un ou l'autre des deux et le formulaire soumet. P>
public class MyViewModel { private int _valueA; private int _valueB; public int ValueA { get { return _valueA; } set { if (value > 0) { ValueB = 0; } _valueA = value; } } public int ValueB { get { return _valueB; } set { if (value > 0) { ValueA = 0; } _valueB = value; } } }
4 Réponses :
Voici le code de la source MVC pour la zone de texte: et le code pour getModelstatevalue () p> alors que Il se produit est l'HTML "Helper" recherche la valeur de la zone de texte, en faisant correspondre le nom, dans votre visionnageData.modalstate, si c'est dans le dictionnaire de modèles de modèle, il ignore complètement fort> la valeur que vous avez fournie. P > donc tout ce que si (valeur> 0) {valeur = 0; } n'a pas d'importance car il va utiliser les valeurs affichées en modélistate si la correspondance des noms. P> La façon dont j'ai réparé cela est de souffler le modalstate avant que l'affichage des valeurs que je veux gâcher avec mes modèles de vue. Ceci est un code que j'ai utilisé: p>
Merci pour l'aperçu Jfar! Basé sur votre réponse, j'ai chucké les aides à la Textebox ont plutôt utilisé les entrées HTML. Il n'y avait que deux entrées sur ma forme qui avaient besoin de ce comportement, alors je suis allé à la simplicité de passer à travers le dictionnaire de modèles de modèle. Votre message était très perspicace et m'a conduit à la solution, alors merci encore!
Merci! C'était une grande aide pour moi aussi.
Avez-vous une idée des raisons pour lesquelles Microsoft implémende la boîte de texte code> HTML Helper de cette manière?
Gaspillé une journée de débogage de ce comportement. Merci d'avoir répondu !
merci jfar .. Ceci est le code VB:
Sub CleanForm(ByVal ParamArray Fields() As String) Dim modelStateValue As ModelState = Nothing For Each Field In Fields If ModelState.TryGetValue(Field, modelStateValue) Then ModelState.SetModelValue(Field, New ValueProviderResult(Nothing, Nothing, Nothing)) End If Next End Sub
Effacement de l'ensemble de la modélisation peut également faire le truc:
Comme @JFar mentionné, supprimer la variable de la modélisation de votre contrôleur fera le tour. Vous pouvez le faire avec moins de code, mais (ces jours-ci, au moins).
ModelState.Remove("ValueA");
J'ai réalisé qu'il y a une légère faille dans mon exemple, mais le problème survient toujours. Au lieu de la mise à zéro de l'autre valeur dans le modèle de vue, cette logique doit se produire dans l'action du contrôleur, car je ne peux pas garantir la présence de la présence de la propriété pendant la liaison du modèle.