2009-06-04 13 views
5

Tengo una aplicación sencilla prueba:¿Html.TextBox usa Request.Params en lugar de Model?

Modelo:

public class Counter 
{ 
    public int Count { get; set; } 

    public Counter() 
    { 
     Count = 4; 
    } 
} 

controlador:

public class TestController : Controller 
{ 
    public ActionResult Increment(Counter counter) 
    { 
     counter.Count++; 
     return View(counter); 
    } 
} 

Vista:

<form action="/test/increment" method="post"> 
    <input type="text" name="Count" value="<%= Model.Count %>" /> 
    <input type="submit" value="Submit" /> 
</form> 

clic en Enviar consigo tales valores:

5, 6, 7, 8, ...

Con Html.TextBox que espera el mismo comportamiento

<form action="/test/increment" method="post"> 
    <%= Html.TextBox("Count") %> 
    <input type="submit" value="Submit" /> 
</form> 

pero en realidad tiene

5, 5, 5, 5.

Parece que Html.TextBox utiliza Request.Params en lugar de Modelo?

Respuesta

8

Html.TextBox() utiliza internamente el método ViewData.Eval() que primero intenta recuperar un valor del diccionario ViewData.ModelState y luego recupera el valor de una propiedad de ViewData.Model. Esto se hace para permitir restaurar los valores ingresados ​​después de enviar el formulario no válido.

Eliminando el valor de Conteo de ViewData.diccionario ModelState ayuda:

public ActionResult Increment(Counter counter) 
{ 
    counter.Count++; 
    ViewData.ModelState.Remove("Count"); 
    return View(counter); 
} 

Otra solución es hacer dos métodos diferentes de control para poder conseguir y las operaciones de la publicación:

public ActionResult Increment(int? count) 
{ 
    Counter counter = new Counter(); 

    if (count != null) 
     counter.Count = count.Value; 

    return View("Increment", counter); 
} 

[AcceptVerbs(HttpVerbs.Post)] 
public ActionResult Increment(Counter counter) 
{ 
    counter.Count++; 

    return RedirectToAction("Increment", counter); 
} 

objeto de contador también podría pasar a través de diccionario TempData.

Puede que también le interese el artículo Repopulate Form Fields with ViewData.Eval() de Stephen Walther.

+0

Gracias, Alexander! – alex2k8

+0

Entonces, ¿por especificar de forma explícita Model.Count no funciona? <% = Html.TextBox ("Count", Model.Count)%> Debido –

+1

al principio Html.TextBox() toma valor del diccionario ModelState. –

0

Html.TextBox tiene más parámetros que el parámetro one..first es el nombre o identificador del elemento de entrada, y el segundo es el valor ...

Así que escribe su ayudante de texto así:

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

aplausos

+3

Esto no funciona así :-( – alex2k8

1

Ese no es el problema aquí. Especificación de

<%= Html.TextBox("Count") %> 

es equivalente a especificar

<%= Html.TextBox("Count", null) %> 

que se tire del valor coincidente (llamado "Count") de la ModelStateDictionary.

Pero aún así, pasando explícitamente en

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

resultados en el mismo comportamiento descrito por alex2k8.

Cuestiones relacionadas