Мои редакторы HTML игнорируют любое значение, которое я установил, и всегда берут свои значения из данных запроса.Зачем? - PullRequest
2 голосов
/ 06 февраля 2012

У меня есть ситуация, в которой есть HTTP-параметр GET с именем «Date», и это делает невозможным создание TextBox с именем «Date» и установку нужного значения для него.

На мой взгляд, если я напишу:

@Html.TextBox("Date", "99/99/9999")

TextBox будет отображаться не со значением 99/99/9999, а со значением, полученным из запроса, скажем: 02/07/2012. То же самое происходит, если я использую EditorFor, передавая значение из модели представления (которое я активно устанавливаю в значение, отличное от 02/07/2012)

Я не могу переопределить данные запроса, несмотря ни на что.

Что мне делать?

EDIT

Как мудро объяснил Дарин Димитров, всякий раз, когда вы хотите изменить значение, полученное из запроса, чтобы отобразить его в представлении, вы должны удалить его из ModelState.

Это особенно полезно при работе с DateTime в запросах GET. Привязка модели ASP.NET MVC заставляет дату быть в формате MM/dd/yyyy в запросах GET. Но когда вы хотите отобразить его пользователю, вы можете переформатировать его в dd/MM/yyyy, возможно, используя DisplayFormatAttribute. Однако это невозможно, если вы сначала не удалите дату из ModelState.

1 Ответ

5 голосов
/ 06 февраля 2012

Что мне делать?

Удалите его из ModelState в действии контроллера POST:

[HttpPost]
public ActionResult Foo(MyViewModel model)
{
    ModelState.Remove("Date");
    return View(model);
}

Очевидно, что вы не будете работать со слабо набранными помощниками:

@Html.TextBox("Date", "99/99/9999")

Вы хотите работать со строго типизированными моделями и шаблонами редактора:

@Html.EditorFor(x => x.Date)

И в вашем действии контроллера POST вы установите требуемую дату:

[HttpPost]
public ActionResult Foo(MyViewModel model)
{
    ModelState.Remove("Date");
    model.Date = "99/99/9999";
    return View(model);
}

Я явно использовал строку в качестве свойства Date здесь, что, вероятно, неправильно, я просто был озадачен допустимостью строки 99/99/9999 в качестве даты. Но, очевидно, то же относится и к датам.

Причина этого в том, что помощники HTML сначала смотрят на ModelState при связывании их значений и после этого в модели. Таким образом, даже если вы измените значение в модели, если у вас есть другое значение в ModelState (что часто происходит в действиях POST), это будет значение из ModelState, которое будет использоваться. Это по замыслу.

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