我正在使用 ASP.NET MVC 2 Beta。我可以使用 Steven Sanderson 的技术(在他的《Pro ASP.NET MVC 框架》一书中)创建一个类似工作流的向导,除了使用 Session 而不是隐藏的表单字段来跨请求保存数据。当我的模型不是集合时,我可以在页面之间来回切换并维护 TextBox 中的值而不会出现任何问题。一个例子是一个简单的 Person 模型:
public class Person
{
public string Name { get; set; }
public int Age { get; set; }
public string Email { get; set; }
}
但是当我传递一个 IEnumerable 时,我无法让它工作。在我看来,我正在尝试遍历模型并为列表中的每个人生成名称和电子邮件的文本框。我可以很好地生成表单,我可以使用我的值提交表单并转到第 2 步。但是,当我在 Step2 中单击 Back 按钮时,它会将我带回 Step1,并带有一个空表单。我之前填充的字段都不存在。一定有什么我错过了。有人可以帮帮我吗?
这是我的观点:
<% using (Html.BeginForm()) { %>
<% int index = 0;
foreach (var person in Model) { %>
<fieldset>
<%= Html.Hidden("persons.index", index.ToString())%>
<div>Name: <%= Html.TextBox("persons[" + index.ToString() + "].Name")%></div>
<div>Email: <%= Html.TextBox("persons[" + index.ToString() + "].Email")%></div>
</fieldset>
<% index++;
} %>
<p><input type="submit" name="btnNext" value="Next >>" /></p>
<% } %>
这是我的控制器:
public class PersonListController : Controller
{
public IEnumerable<Person> persons;
protected override void OnActionExecuting(ActionExecutingContext filterContext)
{
persons = (Session["persons"]
?? TempData["persons"]
?? new List<Person>()) as List<Person>;
// I've tried this with and without the prefix.
TryUpdateModel(persons, "persons");
}
protected override void OnResultExecuted(ResultExecutedContext filterContext)
{
Session["persons"] = persons;
if (filterContext.Result is RedirectToRouteResult)
TempData["persons"] = persons;
}
public ActionResult Step1(string btnBack, string btnNext)
{
if (btnNext != null)
return RedirectToAction("Step2");
// Setup some fake data
var personsList = new List<Person>
{
new Person { Name = "Jared", Email = "test@email.com", },
new Person { Name = "John", Email = "test2@email.com" }
};
// Populate the model with fake data the first time
// the action method is called only. This is to simulate
// pulling some data in from a DB.
if (persons == null || persons.Count() == 0)
persons = personsList;
return View(persons);
}
// Step2 is just a page that provides a back button to Step1
public ActionResult Step2(string btnBack, string btnNext)
{
if (btnBack != null)
return RedirectToAction("Step1");
return View(persons);
}
}