2010-02-19 9 views
8

Ich versuche nur, zurück in .NET MVC mit der neuen Version zu bekommen, und ich kann nicht meinen Kopf rund um den Weg erhalten, ist verbindlich für das DataModel.Was ich falsch verstehe, wie Html.TextBoxFor funktioniert

Ich habe ein Modell mit einer Eigenschaft „first_name“ und innerhalb einer HTML-Form habe ich die folgenden

<%= 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 %>" /> 

In einer Aktion auf einem Controller, wenn ich die first_name Eigenschaft auf meinem Modell gesetzt und tue

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

Was ist der Grund, warum nur die dritte Textbox diesen Wert von first_name aufgreift und die anderen beiden nicht?

Edit:

Ich habe wahrscheinlich die gut genug, um nicht erklärt, sorry. Stellen Sie sich vor, ich habe 2 Controller-Methoden -

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

Mit diesem entweder Bindung funktioniert.

Danach wurde angezeigt ich dann auf eine Schaltfläche auf dem Formular klicken und versuchen, und führen Sie dies:

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

Was ich frage ist, warum funktioniert die dritte aber nicht die erste 2 binden an „Steve“ als der neue Name.

+0

Sind alle aber nur drei Textfelder angezeigt das dritte hat „Test“ in? Oder wird nur das dritte Textfeld angezeigt? Ich habe gerade Ihren Code in einer Test-App versucht und alle drei funktionieren gut. Welche Version von MVC 2 verwenden Sie? – lancscoder

+0

Hallo Simon, sorry - mehr Hintergrund hinzugefügt es nach einem HttpPost, dass ich nicht scheinen kann, um den Wert, z. wenn ich eine Schaltfläche im Formular "Klicken Sie hier, wenn Ihr Name Steve ist" hätte. dann füllt es den Wert des dritten Textfelds und lässt die anderen zwei. Tut mir leid, ein bisschen Anfänger Ich bin mir sicher, dass ich das mit meiner Erklärung für jeden schwieriger mache. –

+0

Dies hat möglicherweise etwas mit Ihrem ModelState zu tun, da Sie die gleiche Ansicht bereitstellen und zurückgeben, aber nicht die Formularsammlungswerte verwenden, um das Modell zu aktualisieren. Überprüfen Sie Ihre ModelState-Schlüssel und -Werte, um zu sehen, ob beim zweiten Rendern der Seite der Wert für die ersten beiden Felder "test" oder "Steve" ist. –

Antwort

5

Da HTML Helfer den Wert aus dem Model lesen und nicht aus dem Modell. Um dieses Verhalten zu ändern, müssen Sie auch mit ModelState arbeiten.
(siehe: Changing model’s properties on postback)

+2

Sie haben ganz Recht, wie Chris in seinem Kommentar oben ist. Der ModelState hatte immer noch die Inhalte, die zurückgeschickt wurden, und der HTML-Helfer bindet sich standardmäßig an diesen und nicht an das Objekt, das ich ihm gegeben habe. Alles was es braucht, ist ModelState.Klar(); Vielen Dank, einige Dinge sehen sehr kompliziert aus, bis sie Ihnen erklärt werden! –

+0

@Doug, wenn ich mich nicht irre "ModelState [" first_name "]. Wert = new ValueProviderResult (" Steve "," Steve ", CultureInfo.CurrentCulture);' sollte auch den Trick machen. Falls Sie das gesamte Wörterbuch nicht löschen möchten. –

+0

Verwenden Sie 'ModelState.Remove (" FirstName ");' anstelle von 'ModelState [" first_name "]. Value = ...' –

1

Dies sollte für die ersten beiden arbeiten:

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

Danke für einen Blick. Ich habe den Fall auf (Modell => Model.first_name) auf (Modell => model.first_name) behoben, aber es hat keinen Unterschied gemacht. Ich habe mehr Hintergrund hinzugefügt, was ich mache, falls das hilft. –

8

Sie benötigen Modellzustand zu löschen, damit Ihr Code etwas aussehen würde:

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