2010-08-12 22 views
5

¿Es esto un error o una característica?¿Por qué mi miembro de MVC ViewModel es anulado por mi parámetro ActionResult?

Todo el código siguiente se ha simplificado en aras de la brevedad y la fácil replicación y en realidad no hace nada útil que no sea resaltar el comportamiento.

tengo una clase que incluye un int llamado ID:

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

En mi controlador, tengo una ActionResult Editar que toma un parámetro llamado 'id':

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

en mi índice ver tengo un enlace a la acción de edición que especifica el parámetro 'id':

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

En mi opinión tengo ac Ouple de cuadros de texto:

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

que hace que el siguiente en HTML:

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

en cuenta que la entrada con un id de "ID" está recibiendo su valor no desde el modelo como yo estoy diciendo que a ... pero a partir del parámetro que se suministró a mi ActionResult. Este comportamiento es el mismo con Html.TextBoxFor, Html.Hidden, Html.HiddenFor, etc.

¿Qué ofrece?

EDIT: Tenía la intención de actualizar esto hace mucho tiempo, pero nunca lo hice. La razón por la que esto está sucediendo es porque ModelState tendrá una entrada "id" con el valor del parámetro "id" en el método y MVC ViewEngine primero verifica el estado del modelo al completar los helpers Html en lugar del modelo. Con el fin de solucionar este problema, sólo tiene que añadir la siguiente línea en su controlador justo antes del regreso:

ModelState.Remove("id"); 

Ahora el% = Html.TextBox < ("ID", Model.ID)%> obtendrá el valor del Modelo y no del Estado modelo. Problema resuelto.

Respuesta

7

Así es como funcionan los helpers html. Primero verán si hay un parámetro de ID en la URL de solicitud y usarán ese valor en lugar del especificado como segundo argumento en el modelo.

+0

De hecho, parece ser el caso. Simplemente me parece mal. Es el comportamiento correcto cuando le das un nombre (es decir, <% = Html.TextBox ("ID")%>), pero si especifico que el valor debe venir del modelo usando <% = Html.TextBox (" ID ", Model.ID)%> o <% = Html.TextBoxFor (x => x.ID)%>, entonces de ahí viene el valor, creo. Es especialmente preocupante que TextBoxFor muestre este comportamiento, ya que se supone que es totalmente impulsado por el modelo. –

+0

@Bradley, estoy de acuerdo con usted en que este comportamiento podría ser engañoso para alguien que no esté familiarizado con él, pero una vez que se acostumbre no debería haber problemas. –

+0

siento que me tomó tanto tiempo aceptar esta respuesta. Se distrajo .... por un año ... :) –

Cuestiones relacionadas