8
votes

Si la valeur change de modèle après post, le formulaire affiche toujours une valeur ancienne

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;
  }
 }
}


1 commentaires

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.


4 Réponses :


8
votes

Voici le code de la source MVC pour la zone de texte: xxx

et le code pour getModelstatevalue () xxx

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 la valeur que vous avez fournie.

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.

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é: xxx


4 commentaires

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 HTML Helper de cette manière?


Gaspillé une journée de débogage de ce comportement. Merci d'avoir répondu !



0
votes

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


0 commentaires

8
votes

Effacement de l'ensemble de la modélisation peut également faire le truc: xxx


0 commentaires

0
votes

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");


0 commentaires