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