2011-03-15 4 views
1

hejdig.Le modèle aspnetmvc est mis à jour mais ne met pas à jour le contrôle

Dans Aspnetmvc2, j'ai un objet modèle que j'envoie à une vue. Un contrôle dans la vue n'est pas mis à jour avec la valeur. Pourquoi? Dans quel piège évident suis-je tombé?

La vue:

<%:Html.TextBox(
    "MyNumber", 
    null == Model ? "1111" : Model.MyNumber) %> 
<%:Model.MyNumber%> 

est d'abord un creux tiré par les cheveux Get. La valeur "1111" dans la zone de texte est mise à jour manuellement à "2222". Nous posons le formulaire au contrôleur qui ajoute "2222" à l'objet Modèle et l'envoie à nouveau à la vue.

Le contrôleur:

[HttpGet] 
    public ActionResult Index() 
    { 
     return View(); 
    } 
    [HttpPost] 
    public ActionResult Index(MyModel myModel) 
    { 
     myModel.MyNumber += " 2222"; 
     return View(myModel); 
    } 

Alltogether nous obtenons une sortie comme:

<input id="MyNumber" type="text" value="1111"> 
1111 2222 

Comme vous pouvez le voir le contrôle ne pas utiliser l'attribut mais tombe plutôt revenir à Thew viewstate du modèle qui doesn n'existe pas dans Aspnetmvc. C'est la même chose avec Razor.)

Répondre

6

C'est normal et c'est comme ça que les helpers HTML fonctionnent: ils regardent d'abord dans l'état du modèle puis dans le modèle lors de la liaison d'une valeur. Donc, si vous avez l'intention de modifier une propriété dans l'action POST, vous devez d'abord la supprimer de l'état du modèle ou l'ancienne valeur:

[HttpPost] 
public ActionResult Index(MyModel myModel) 
{ 
    ModelState.Remove("MyNumber"); 
    myModel.MyNumber += " 2222"; 
    return View(myModel); 
} 
+2

Utilisez ModelState.Clear() pour effacer toutes les propriétés. – LosManos

+0

Si c'est le cas, alors quel est le point de dire 'return View (model)' (à partir d'une action Edit) si les helpers vont l'ignorer quand même? Deuxième point, beaucoup de vos réponses ont sauvé la journée pour moi, tout comme celle-ci. –

+0

@EricNelson, le point est que le modèle pourrait être utilisé dans la vue dans quelque chose de différent d'un assistant HTML. Par exemple afficher une valeur: '

@Model.MyNumber
'. Si vous ne passez pas le modèle à la vue, vous obtiendrez une jolie NRE. –

Questions connexes