Tenho um aplicativo de teste simples:
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);
}
}
Visão:
<form action="/test/increment" method="post">
<input type="text" name="Count" value="<%= Model.Count %>" />
<input type="submit" value="Submit" />
</form>
Ao clicar em Enviar, recebo esses valores:
5, 6, 7, 8, ...
Com Html.TextBox esperava o mesmo comportamento
<form action="/test/increment" method="post">
<%= Html.TextBox("Count") %>
<input type="submit" value="Submit" />
</form>
mas na verdade consegui
5, 5, 5, 5.
Parece que Html.TextBox usa Request.Params em vez de Model?
Respostas:
8 para resposta № 1Html.TextBox () usa ViewData internamente.Método Eval () que primeiro tenta recuperar um valor do dicionário ViewData.ModelState e, em seguida, recupera o valor de uma propriedade de ViewData.Model. Isso é feito para permitir a restauração dos valores inseridos após o envio de formulário inválido.
Remover o valor Count do dicionário ViewData.ModelState ajuda:
public ActionResult Increment(Counter counter)
{
counter.Count++;
ViewData.ModelState.Remove("Count");
return View(counter);
}
Outra solução é fazer dois métodos de controlador diferentes para operações GET e POST:
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);
}
O objeto contador também pode ser passado por meio do dicionário TempData.
Você também pode estar interessado no artigo Preencher novamente os campos do formulário com ViewData.Eval () por Stephen Walther.
1 para resposta № 2
Esse não é o problema aqui. Especificando
<%= Html.TextBox("Count") %>
é equivalente a especificar
<%= Html.TextBox("Count", null) %>
que extrairá o valor correspondente (denominado "Count") do ModelStateDictionary.
Mas, mesmo assim, passar explicitamente
<%= Html.TextBox("Count", Model.Count) %>
resulta no mesmo comportamento descrito por alex2k8.
0 para resposta № 3
Html.TextBox tem mais parâmetros de um ... o primeiro parâmetro é o nome ou id do elemento de entrada e o segundo é o valor ...
então escreva seu auxiliar de caixa de texto assim:
<%= Html.TextBox("Count",Model.Count) %>
Felicidades