/ / O Html.TextBox usa Request.Params em vez de Model? - asp.net-mvc, html-helper

O Html.TextBox usa Request.Params em vez de Model? - asp.net-mvc, html-helper

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 № 1

Html.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