2010-02-19 3 views
8

J'essaie simplement de revenir à .NET MVC avec la nouvelle version et je ne peux pas contourner le problème car l'affichage est lié au DataModel.Qu'est-ce que je ne comprends pas sur le fonctionnement de Html.TextBoxFor?

J'ai un modèle avec une propriété « prenom » et dans un formulaire HTML que je donne les résultats suivants

<%= Html.TextBox("first_name", Model.first_name)%> 
<%= Html.TextBoxFor(model => model.first_name) %> 
<input type="text" name="first_name" id="first_name" class="myLabel" 
     value="<%=Model.first_name %>" /> 

Dans une action sur un contrôleur si je mets la propriété prenom sur mon modèle et ne

mymodelObject.first_name = "Test"; 
return View(mymodelObject); 

Pour quelle raison seule la troisième zone de texte récupère cette valeur first_name et les deux autres pas?

Edit:

J'ai probablement pas expliqué ce assez bien, désolé. Imaginez que j'ai 2 méthodes de contrôleur -

public ActionResult Register() 
{ 
    Registration model = new Registration(); 
    model.first_name = "test"; 
    return View(model); 
} 

Avec celui-ci soit la reliure fonctionne.

Après cela a été affiché, je puis cliquer sur un bouton sur la forme et essayer de lancer ceci:

[HttpPost] 
public ActionResult Register(Registration_ViewData model) 
{ 
    model.first_name = "Steve"; 
    return View(model); 
} 

Ce que je demande est pourquoi le 3ème mais pas la première 2 se lient à « Steve » comme le nouveau nom.

+0

sont tous les trois zones de texte affiché, mais le troisième a « Test » dans? Ou est-ce seulement la troisième zone de texte affichée? Je viens d'essayer votre code dans une application de test et tous les trois fonctionnent bien. Quelle version de MVC 2 utilisez-vous? – lancscoder

+0

Salut Simon, désolé - plus d'arrière-plan ajouté son après un HttpPost que je ne peux pas sembler définir la valeur, par exemple. si j'avais un bouton sur le formulaire appelé "Cliquez ici si vous vous appelez Steve". alors il remplit la valeur de la troisième zone de texte et laisse les deux autres. Pardon d'un débutant Je suis sûr que je rends cela plus difficile pour tout le monde avec mon explication. –

+0

Cela peut avoir un rapport avec ModelState car vous publiez et renvoyez la même vue, mais vous n'utilisez pas réellement les valeurs de collection de formulaires pour mettre à jour le modèle. Vérifiez vos clés ModelState et les valeurs pour voir si lors du rendu de la page la deuxième fois, la valeur pour les deux premières cases est "test" ou "Steve". –

Répondre

5

Parce que les aides HTML lisent la valeur de la ModelState et non du modèle. Pour modifier ce comportement, vous devez également utiliser ModelState.
(voir: Changing model’s properties on postback)

+2

Vous avez raison, tout comme Chris dans son commentaire ci-dessus. Le ModelState avait toujours les contenus qui étaient postés et le HTML Helper par défaut s'y lie plutôt que l'objet que je lui ai donné. Tout ce dont il a besoin est ModelState.Clair(); Merci à tous, certaines choses semblent très compliquées jusqu'à ce qu'on vous les explique! –

+0

@Doug, si je ne me trompe pas ModelState ["first_name"]. Value = new ValueProviderResult ("Steve", "Steve", CultureInfo.CurrentCulture); 'devrait également faire l'affaire. Au cas où vous ne voulez pas effacer tout le dictionnaire. –

+0

utilisez 'ModelState.Remove (" FirstName ");' au lieu de 'ModelState [" first_name "]. Value = ...' –

1

Cela devrait fonctionner pour les deux premiers:

<%= Html.TextBox("first_name", x => x.first_name)%> 
<%= Html.TextBoxFor(model => model.first_name) %> 
+1

Merci d'avoir jeté un oeil. J'ai corrigé le casse sur (model => Model.first_name) à (model => model.first_name) mais cela n'a fait aucune différence. J'ai ajouté plus d'informations sur ce que je fais au cas où cela serait utile. –

8

Vous devez effacer votre état de modèle afin de votre code ressemblerait à quelque chose comme:

[HttpPost] 
public ActionResult Register(Registration model) 
{ 
    ModelState.Clear(); 
    model.first_name = "Steve"; 
    return View(model); 
} 
Questions connexes