2010-08-12 8 views
5

È un bug o una funzionalità?Perché il mio membro MVC ViewModel è sovrascritto dal mio parametro ActionResult?

Tutto il codice riportato di seguito è stato semplificato per brevità e facile replica e in realtà non fa nulla di utile se non evidenziare il comportamento.

ho una classe che include un int di nome ID:

public class FooterLink 
{ 
    public int ID { get; set; } 
} 

Nel mio controller, ho un Edit ActionResult che richiede un parametro chiamato 'id':

public ActionResult Edit(int id) 
{ 
    return View(new FooterLink() { ID = 5 }); //notice that I am explicitly setting the ID value here. 
} 

nel mio indice vista Ho un collegamento all'azione di modifica che specifica il parametro 'id':

<%= Html.ActionLink("Edit", "Edit", new { id = 1 })%> 

A mio avviso, ho un ac ouple di caselle di testo:

<%= Html.TextBox("ID", Model.ID)%> 
<%= Html.TextBox("Blah", Model.ID) %> 

che rende quanto segue in HTML:

<input id="ID" name="ID" type="text" value="1"> 
<input id="Blah" name="Blah" type="text" value="5"> 

Si noti che l'ingresso con un id di "ID" sta ottenendo il suo valore non dal modello come sto dicendo che a ... ma dal parametro che è stato fornito al mio ActionResult. Questo comportamento è lo stesso con Html.TextBoxFor, Html.Hidden, Html.HiddenFor, ecc.

Cosa dà?

EDIT: Volevo aggiornarlo molto tempo fa ma non ci sono riuscito. La ragione per cui ciò sta accadendo è che ModelState avrà una voce "id" con il valore del parametro "id" nel metodo e MVC ViewEngine prima controlla ModelState quando riempie gli helper Html invece del Modello. Al fine di ovviare a questo, si può semplicemente aggiungere la seguente riga nel controller appena prima del ritorno:

ModelState.Remove("id"); 

Ora il <% = Html.TextBox ("ID", Model.ID)%> otterrà il valore dal Modello e non dal ModelState. Problema risolto.

risposta

7

Ecco come funzionano gli helper html. Verranno innanzitutto esaminati se nell'URL della richiesta è presente un parametro ID e utilizzare tale valore anziché quello specificato come secondo argomento nel modello.

+0

In effetti, sembra essere il caso. Mi sembra sbagliato. È il comportamento corretto quando gli si assegna un nome (es. <% = Html.TextBox ("ID")%>), ma se si specifica che il valore dovrebbe provenire dal modello usando <% = Html.TextBox (" ID ", Model.ID)%> o <% = Html.TextBoxFor (x => x.ID)%>, quindi è da lì che il valore dovrebbe provenire. È particolarmente preoccupante che TextBoxFor mostri questo comportamento poiché si suppone che sia interamente guidato dal modello. –

+0

@Bradley, sono d'accordo con te sul fatto che questo comportamento potrebbe essere fuorviante per qualcuno che non ha familiarità con esso, ma una volta che ci si abitua non ci dovrebbero essere problemi. –

+0

scusate, mi ci è voluto così tanto tempo per accettare questa risposta. Mi sono distratto .... per un anno ... :) –

Problemi correlati