ASP.Net MVC Web应用程序:Html.DisplayFor和Html.HiddenFor给出不同的结果

时间:2011-05-07 19:03:56

标签: asp.net-mvc asp.net-mvc-3

我正在网页上实现一个两步向导的过程。该操作是将学生重新分配给另一位老师。由于许多网站上有许多教师,因此第一步是从网站的下拉列表中进行选择。第二步是在该站点选择一名教师。

我有一个单一的视图模型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.HiddenForHtml.EditorFor正在获取陈旧的缓存值。

在任何情况下,我都会看到我的解决方法,这只是为了在我的视图中对步骤编号进行硬编码。

1 个答案:

答案 0 :(得分:3)

请在控制器中返回视图之前立即尝试使用此语句。

ModelState.Clear();

我相信这可以解决你的问题。