Использует ли Html.TextBox Request.Params вместо Model? - PullRequest
5 голосов
/ 05 июня 2009

У меня есть простое тестовое приложение:

Модель:

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

    public Counter()
    {
        Count = 4;
    }
}

Контроллер:

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

Вид:

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

Нажав Submit, я получаю такие значения:

5, 6, 7, 8, ...

С Html.TextBox я ожидал того же поведения

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

но на самом деле получил

5, 5, 5, 5.

Кажется, Html.TextBox использует Request.Params вместо Model?

Ответы [ 3 ]

8 голосов
/ 05 июня 2009

Html.TextBox () внутренне использует метод ViewData.Eval (), который сначала пытается извлечь значение из словаря ViewData.ModelState, а затем - извлечь значение из свойства ViewData.Model. Это сделано для того, чтобы разрешить восстановление введенных значений после неверной отправки формы.

Удаление значения счетчика из словаря ViewData.ModelState помогает:

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

Другим решением является создание двух разных методов контроллера для операций GET и 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);
}

Объект счетчика также может быть передан через словарь TempData.

Вас также может заинтересовать статья Повторное заполнение полей формы с помощью ViewData.Eval () от Stephen Walther.

1 голос
/ 05 июня 2009

Это не проблема здесь. Указание

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

эквивалентно указанию

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

, который будет извлекать соответствующее значение (с именем "Count") из ModelStateDictionary

Но даже в этом случае, явно передавая

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

приводит к тому же поведению, описанному alex2k8.

0 голосов
/ 05 июня 2009

Html.TextBox имеет больше параметров, чем один ... первый параметр - это имя или идентификатор элемента ввода, а второй - значение ...

, так напишите свой помощник по тексту:

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

ура

...