Почему элементы ввода не отображают значение, переданное в ASP.Net MVC? - PullRequest
3 голосов
/ 19 марта 2010

Этот пост задает этот вопрос, но не дает ответа, поэтому я подумал, что задам вопрос по-другому.

У меня есть страница, которая отображает скрытое значение из модели:

<%=Html.Hidden("myName", model.myValue) %>

Поскольку я передаю значение в параметре value, можно подумать, что оно выведет это значение, но это не так.

Код для рендеринга полей ввода имеет следующий вид:

string attemptedValue = (string)htmlHelper.GetModelStateValue(name, typeof(string));
tagBuilder.MergeAttribute("value", attemptedValue ?? ((useViewData) ? htmlHelper.EvalString(name) : valueParameter), isExplicitValue);

В основном, если ModelState (который содержит опубликованные значения) содержит значение для переданного «имени», он будет использовать это значение вместо вашего переданного значения в вспомогательный метод. В моем случае я обновил модель, и мое обновленное значение не было выведено.

Если я передам значение методу, я ожидаю, что это значение будет отображено.

Я что-то упустил в этом дизайне или это просто неправильно?

1 Ответ

2 голосов
/ 19 марта 2010

Это по замыслу. Вот предполагаемый поток:

  1. Пользователь запрашивает определенный URI.
  2. Ваш контроллер строит модель.
  3. Вид отображается. В этом месте словарь ModelState должен быть пустым, поэтому будет передано значение, которое вы передаете Html.Hidden. Однако данная функция более непосредственно связана с пользовательским вводом, поэтому рассмотрим случай Html.TextBox("someName", Model.SomeValue)
  4. Теперь представьте, что пользователь вводит некоторые неверные данные. Если у вас есть проверка на стороне клиента, она будет обнаружена до POST, но давайте притворимся, что нет, или что пользователь каким-то образом ее обошел.

В этом случае действие, которое обрабатывает POST, вернет ViewResult, в результате чего представление из шага 3 будет перерисовано. Однако пользователь увидит введенное им значение (чтобы он мог это исправить) вместо значения из вашего объекта модели. Идея здесь в том, что данные, которые пользователь, возможно, ввел, не могут быть представлены в виде значения в Model.SomeValue из-за безопасности типов. Например, если Model.SomeValue имеет тип integer и пользователь вводит «ABC», единственный способ перерисовать данные пользователя - поместить их в другое место. И это «где-то еще» - ModelState.

Повторное отображение недействительных данных пользователя позволяет пользователю исправить введенные данные и повторно опубликовать форму.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...