Веб-приложение ASP.Net MVC: Html.DisplayFor и Html.HiddenFor дают разные результаты - PullRequest
2 голосов
/ 07 мая 2011

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

У меня есть одна модель представления, StudentReassignmentForm, со свойствами, необходимыми для каждого шага процесса, такими как FirstName, LastName, StudentId, TeacherId, SiteId,и т.д. Есть также свойство Step, которое отслеживает, какой шаг процесса является текущим.Обработчик записей просматривает номер шага и обновляет форму, чтобы показать следующий шаг, а затем показывает представление для этого шага.Тот же метод post обрабатывает каждый шаг процесса.Разобравшись до сути, мои методы контроллера:

public ActionResult ReassignStudent(int studentId)
{
  // ... look up student and prepare for step 1 ...

  StudentReassignmentForm form = new StudentReassignmentForm();
  form.Step = 1;
  form.StudentId = studentId;
  form.FirstName = ...;
  form.LastName = ...;
  form.Sites = [IList<Site> of all sites]

  return View("ReassignStudent1", form);
}


[AcceptVerbs(HttpVerbs.Post)]
public ActionResult ReassignStudnet(StudentReassignmentForm form)
{
  switch(form.Step)
  {
    case 1:
      // Prepare for step 2 by looking up teachers at chosen site
      form.Teachers = [IList<Teacher> of teachers at the site]
      form.Step = 2;

      return View("ReassignStudent2", form);
      break;

    case 2:
      // Make final reassignment
      // ...
  }
}

Первый шаг работает отлично.Я могу выбрать сайт, и на обратной передаче form.SiteId настроен правильно.

Проблема в том, что, хотя я явно устанавливаю form.Step = 2, представление ReassignStudent2 отображается с шагом 1Uisng Fiddler, я вижу, что то, что идет от сервера к браузеру, это значение 1 (так что это не то представление, которое почему-то идет не так).

EDIT : прояснена проблема в заголовке

РЕДАКТИРОВАТЬ Я провел еще несколько экспериментов и обнаружил, что если я изменю свой взгляд на использование Html.DisplayFor(m => m.Step) вместо Html.HiddenFor(m => m.Step), он отобразит правильное текущее значение шага 2 вместостарое значение шага 1. Затем я попытался Html.EditorFor(m => m.Step), и он также выдал неправильное значение 1.

Мой обработчик POST использует один и тот же экземпляр модели как для ввода, так и для вывода.Система создает StudentReassignmentForm из данных POST, затем я изменяю некоторые значения, добавляю некоторые другие и использую его для визуализации представления для следующего шага.Это поддерживаемый сценарий?Интересно, связана ли проблема с кэшированием значений лямбда-выражений (что, я полагаю, сделано для повышения производительности).Возможно, Html.HiddenFor и Html.EditorFor выбирают устаревшее кэшированное значение.

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

1 Ответ

3 голосов
/ 13 июля 2011

Пожалуйста, попробуйте использовать это утверждение непосредственно перед возвратом представления в вашем контроллере.

ModelState.Clear();

Я считаю, что это должно решить вашу проблему.

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