MVC Html.textbox / dropdown / все, что не будет обновляться при обратной передаче - PullRequest
1 голос
/ 18 июня 2010

ОК, давайте начнем с Html.Textbox. Он должен содержать текст, прочитанный из файла. Чтение файла основано на том, что пользователь выбирает из выпадающего списка.

В первый раз все нормально. Пользователь выбирает значение из выпадающего списка. Контроллер использует это значение для чтения некоторого текста из файла и возвращает этот текст в представление через модель представления. Все хорошо.

Затем пользователь выбирает другое значение из выпадающего списка. Контроллер читает новое значение из файла и возвращает его через модель представления. Отладка в LINE ДО ТОГО, как HTML.TEXTBOX установлен в представлении, показывает, что модель содержит правильное значение. Тем не менее, само текстовое поле все еще показывает ПРЕДЫДУЩЕЕ значение, когда страница отображается!

Если я переключаюсь с Html.Textbox на простой ввод, введите html-элемент type = "text", все работает нормально. Это не так сложно, но то же самое происходит с моим выпадающим списком - я не могу установить выбранное значение в коде. Это всегда возвращается к тому, что было выбрано последним. Рендеринг тега «select» с динамически генерируемым списком опций - это боль. Я хотел бы иметь возможность использовать Html.Dropdown.

Что мне здесь не хватает ?? Это такая простая вещь в веб-формах!

Ответы [ 3 ]

1 голос
/ 18 июня 2010

Когда вы публикуете форму, публикуемые значения помещаются в ModelState. Когда HtmlHelper рендерит HTML-элемент iunput, например, Html.TextBoxFor(x => x.FirstName), он будет искать в разных местах, чтобы получить значение для текстового поля ... ModelState находится перед ViewData.Model в списке мест. Таким образом, ранее опубликованное значение появится в вашем текстовом поле.

Чтобы исправить это, вы можете очистить значение ModelState или обновить значение ModelState. НО я бы посчитал это хакерским способом обойти проблему.

Реальная проблема связана с потоком сообщений и запросов. Я лично изучил бы это и, возможно, реализовал шаблон PRG (Post Redirect Get).

HTHS
Чарльз

0 голосов
/ 26 августа 2010

Исходя из сказанного Чарльзом / Чарлино:

Привязка модели обновляет объект ModelState, который содержит ошибки проверки и привязки модели, которые собираются во время привязки модели.

Внутри действияметод, привязка модели уже произошла для обновления модели и сгенерировал объект ModelState.Если вы теперь обновите значение модели внутри действия, вы также должны вручную обновить состояние модели (поскольку помощники используют его для генерации своего HTML).Ниже приведен пример:

model.CaptchaIsValid = CaptchaService.ValidateAndExpireCaptcha(model.CaptchaAttempt);
if (!model.CaptchaIsValid)
{
    ModelState.AddModelError("CaptchaAttempt", "Incorrect - please try again");
}

// I'll clear the value on each attempt, to force them to re-enter a CAPTCHA.
model.CaptchaAttempt = string.Empty;

// Since I updated the model, I must create a new ValueProvider result...
ValueProviderResult clearedValue = new ValueProviderResult(
      model.CaptchaAttempt, 
      model.CaptchaAttempt, 
      CultureInfo.CurrentCulture);

// ... and update the ModelState's value.
ModelState.SetModelValue("CaptchaAttempt", clearedValue);
0 голосов
/ 18 июня 2010

Самая большая проблема, которую я вижу здесь, это то, что вы пытаетесь сделать обратную передачу в MVC.Эта модель на самом деле не поддерживается и на самом деле доставляет гораздо больше хлопот, чем стоит (как вы, похоже, выясняете).Я бы порекомендовал использовать Ajax для динамического обновления содержимого раскрывающегося списка.

...