2010-02-19 9 views
8

Sto solo cercando di tornare a .NET MVC con la nuova versione e non riesco a capire come la vista potrebbe essere vincolante per DataModel.Che cosa ho frainteso su come funziona Html.TextBoxFor

Ho un modello con un "first_name" proprietà e all'interno di un modulo HTML che ho il seguente

<%= 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 un'azione su un controller, se ho impostato la proprietà first_name sul mio modello e fare

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

Qual è il motivo per cui solo la terza casella di testo rileva questo valore di primo nome e gli altri due no?

Edit:

Probabilmente non ho spiegato abbastanza bene, mi spiace. Immagino di avere 2 metodi di controllo -

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

Con questo uno dei due lavori vincolanti.

Dopo questa è stata mostrata ho quindi fare clic su un pulsante sul modulo e provare ed eseguire questo:

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

Quello che sto chiedendo è il motivo per cui fa il terzo, ma non i primi 2 si legano a "Steve" come il nuovo nome.

+0

sono tutti i tre caselle di testo visualizzata, ma solo la terza ha "Test" in? O è solo la terza casella di testo visualizzata? Ho appena provato il codice in un'applicazione di test e tutti e tre funzionano bene. Quale versione di MVC 2 stai usando? – lancscoder

+0

Ciao Simon, mi dispiace - più background ha aggiunto il suo dopo un HttpPost che non riesco a impostare il valore, ad es. se avessi un pulsante nel modulo chiamato "Clicca qui se il tuo nome è Steve". quindi riempie il valore della terza casella di testo e lascia gli altri due. po 'dispiaciuto di un principiante sono sicuro che sto facendo questo più difficile per tutti con la mia spiegazione. –

+0

Questo potrebbe avere qualcosa a che fare con il tuo ModelState perché si registra e si restituisce la stessa vista ma in realtà non si usano i valori di raccolta del modulo per aggiornare il modello. Controlla i valori e le chiavi ModelState per vedere se durante il rendering della pagina la seconda volta, il valore per le prime due caselle è "test" o "Steve". –

risposta

5

Perché aiutanti HTML leggere il valore dal ModelState e non dal modello. Per cambiare il comportamento, è necessario lavorare anche con ModelState.
(vedi: Changing model’s properties on postback)

+2

Hai perfettamente ragione, così come Chris nel suo commento sopra. ModelState aveva ancora i contenuti che erano stati postati e l'helper HTML per default si lega a quello invece che l'oggetto che gli ho dato. Tutto ciò di cui ha bisogno è ModelState.Chiaro(); Grazie a tutti, alcune cose sembrano molto complicate finché non ti vengono spiegate! –

+0

@Doug, se non sbaglio 'ModelState [" first_name "]. Value = new ValueProviderResult (" Steve "," Steve ", CultureInfo.CurrentCulture); dovrebbe anche fare il trucco. Nel caso in cui non si voglia cancellare l'intero dizionario. –

+0

usa 'ModelState.Remove (" FirstName ");' invece di 'ModelState [" first_name "]. Value = ...' –

1

Questo dovrebbe funzionare per i primi due:

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

Grazie per dare un'occhiata. Ho fissato il caso (modello => Model.first_name) a (modello => model.first_name) ma non ha fatto alcuna differenza. Ho aggiunto ulteriori informazioni su quello che sto facendo nel caso in cui questo aiuti. –

8

È necessario cancellare il vostro stato modello di modo che il codice sarebbe simile:

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