Я использую MVC 3 в своем проекте и наблюдаю очень странное поведение.
Я пытаюсь создать скрытое поле для определенного значения в моей модели, проблема в том, что по какой-то причине значение, установленное в поле, не соответствует значению в модели.
например
У меня есть этот код, как тест:
<%:Html.Hidden("Step2", Model.Step) %>
<%:Html.HiddenFor(m => m.Step) %>
Я бы подумал, что оба скрытых поля будут иметь одинаковое значение. Что я делаю, так это устанавливаю значение 1 при первом отображении представления, а затем после отправки я увеличиваю значение поля Модель на 1.
Итак, в первый раз, когда я визуализирую страницу, оба элемента управления имеют значение 1, но во второй раз визуализируются следующие значения:
<input id="Step2" name="Step2" type="hidden" value="2" />
<input id="Step" name="Step" type="hidden" value="1" />
Как видите, первое значение правильное, но второе значение кажется таким же, как и при первом отображении представления.
Чего мне не хватает? Кэшируют ли значения как-то вспомогательные программы * For Html? Если да, то как мне отключить это кеширование ?.
Спасибо за вашу помощь.
Ответы:
Это нормально, и так работают помощники HTML. Сначала они используют значение запроса POST, а затем значение в модели. Это означает, что даже если вы измените значение модели в действии вашего контроллера, если в запросе POST есть такая же переменная, ваше изменение будет проигнорировано и будет использоваться значение POSTed.
Один из возможных обходных путей - удалить это значение из состояния модели в действии контроллера, которое пытается изменить значение:
Другая возможность - написать собственный помощник HTML, который всегда будет использовать значение модели и игнорировать значения POST.
И еще одна возможность:
источник
Я столкнулся с той же проблемой при написании мастера, который на каждом этапе показывает разные части большой модели.
Данные и / или ошибки из «Шага 1» смешивались с «Шагом 2» и т.д., пока я, наконец, не понял, что «виноват» ModelState.
Это было мое простое решение:
источник
ModelState.Clear()
решил мою проблему с последовательными запросами POST в аналогичной ситуации.Этот код не будет работать
... потому что HiddenFor всегда (!) читает из ModelState, а не саму модель. И если он не найдет клавишу «Шаг», он создаст значение по умолчанию для этого типа переменной, которое в данном случае будет равно 0.
Вот решение. Я написал это для себя, но не возражаю поделиться им, потому что я вижу, что многие люди борются с этим непослушным помощником HiddenFor.
Затем вы просто используете его как обычно изнутри:
Стоит отметить, что он работает и с коллекциями.
источник
Я слишком борюсь с той же ситуацией, когда я использую одно и то же состояние модели между вызовами и когда я изменяю свойство модели на бэкэнде. Хотя для меня не имеет значения, использую я textboxfor или hiddenfor.
Я просто обхожу эту ситуацию, используя скрипты страниц для хранения значения модели как переменной js, потому что вначале мне нужно скрытое поле для этой цели.
Не уверен, что это поможет, но просто подумайте ...
источник