2009-04-01 13 views
13

He estado jugando con ASP.NET MVC y encontré con algo que no puedo entender.ASP.NET MVC: cambiar las propiedades del modelo en la devolución de datos

Supongamos que tengo un objeto como éste:

public class TestObject 
{ 
    public string Name { get; set; } 
    public int Age { get; set; } 
} 

y una página de vista (Create.aspx) así:

<form action="/Create" method="post"> 
    <p> 
     <%=Html.TextBox("Name") %> 
    </p> 
    <p> 
     <%=Html.TextBox("Age")%> 
    </p> 
</form> 

Y en mi controlador tengo estas acciones:

[AcceptVerbs(HttpVerbs.Get)] 
public ActionResult Create() 
{ 
    return View(new TestObject { Name = "DefaultName", Age = 10 }); 
} 

[AcceptVerbs(HttpVerbs.Post)] 
public ActionResult Create(TestObject o) 
{ 
    o.Name = "ChangedNameToSomethingElse"; 
    o.Age = 15; 
    return View(o); 
} 

El método Html.TextBox() siempre genera los cuadros de texto con los valores predeterminados, incluso después de la posición tback, donde el objeto se devuelve con diferentes propiedades en sus valores. Ahora, concedido, no puedo pensar en un ejemplo del mundo real por el que quisiera hacer tal cosa, pero todavía no entiendo por qué siempre termino teniendo textboxes poblados con los valores del modelo que se establecieron en la acción Crear con el atributo AcceptVerbs(HttpVerbs.Get).

Nota: He intentado Html.TextBox("Name", Model.Name) pero el resultado sigue siendo el mismo. Y verifiqué que realmente se ejecuta la acción Crear con AcceptVerbs(HttpVerbs.Post), pasando un valor a través de ViewData a la Vista. Además, el valor udated se muestra cuando genero el valor con <%=Model.Name %> pero de nuevo, no en el cuadro de texto.

¿Hay algo obvio que me falta, o hay un razonamiento detrás de este comportamiento?

+3

También le puede interesar mi respuesta a una pregunta similar - http://stackoverflow.com/questions/953330/does-html-textbox-uses-request-params-instead-of-model/954524#954524 –

Respuesta

14

Si vincula el resultado de una solicitud posterior a través de la declaración del método o mediante UpdateModel o TryUpdateModel a un objeto como TestObject, una propiedad llamada ModelState se completará con estos valores. Los ayudantes de HTML como Textbox siempre se vincularán a modelstate sobre un objeto de modelo pasado explícitamente.

+0

Gracias Para tu respuesta. ¿Conoces también la forma correcta y sugerida de volver a poblar el Estado modelo, dándole un objeto, tal vez? ¿O debería darle manualmente las claves y los valores, después de borrar la colección? –

+7

Acabo de comprobar. Puede lograr lo que quiera llamando a ModelState.Clear() en su acción Crear con el atributo Publicar. – dpen2000

+0

Sí, parece que funciona. Gracias por tu ayuda otra vez Dejaré la pregunta abierta por un tiempo en caso de que alguien sepa un método diferente que también podría ser útil. –

3

prueba este: - (espero que funcione para usted)

[HttpPost] 
[AcceptVerbs(HttpVerbs.Post)] 
public ActionResult Create(TestObject o) { 
    ModelState.Clear();  
    o.Name = "ChangedNameToSomethingElse";  
    o.Age = 15; 
    return View(o); 
} 
9

Sé que esto fue respondida hace mucho tiempo, pero esta es la solución más específica que funciona para mí.

[HttpPost] 
public ActionResult Create(TestObject o) { 
    ModelState.Remove("Name");  
    o.Name = "ChangedNameToSomethingElse";  
    ModelState.Remove("Age");  
    o.Age = 15; 
    return View(o); 
} 

Espero que esto ayude a alguien por ahí.

Cuestiones relacionadas