我正在网页上实现一个两步向导的过程。该操作是将学生重新分配给另一位老师。由于许多网站上有许多教师,因此第一步是从网站的下拉列表中进行选择。第二步是在该站点选择一名教师。
我有一个单一的视图模型StudentReassignmentForm
,其中包含进程每个步骤所需的属性,如FirstName,LastName,StudentId,TeacherId,SiteId等。还有一个Step
属性,跟踪过程的哪一步是最新的。 post处理程序查看步骤编号,并更新表单以显示下一步,然后显示该步骤的视图。相同的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
的步长值为1. Uisng Fiddler,我看到从服务器到浏览器的内容是值1(所以这不是以某种方式出错的观点)。
编辑:澄清了标题中的问题
修改
我做了一些实验,发现如果我将视图更改为使用Html.DisplayFor(m => m.Step)
而不是Html.HiddenFor(m => m.Step)
,则会将正确的当前步长值设为2而不是旧的步长值1。我尝试Html.EditorFor(m => m.Step)
,它也产生了错误的值1。
我的POST处理程序使用相同的模型实例作为输入和输出。系统从POST数据创建StudentReassignmentForm
,然后我更改一些值,添加其他值,并使用它来呈现下一步的视图。这是支持的方案吗?我想知道问题是否与缓存lambda表达式的值有关(我假设这是为了性能)。可能Html.HiddenFor
和Html.EditorFor
正在获取陈旧的缓存值。
在任何情况下,我都会看到我的解决方法,这只是为了在我的视图中对步骤编号进行硬编码。
答案 0 :(得分:3)
请在控制器中返回视图之前立即尝试使用此语句。
ModelState.Clear();
我相信这可以解决你的问题。