使用后退按钮并重新提交表单时出现问题,绑定到下拉列表的模型上的值不会在第二次提交时保留。
在现实生活中,此代码是一个报告生成器——表单从用户那里收集参数,然后将其发布到显示数据的结果视图。显然,这是一段相当复杂的代码,但下面我有一些简单的代码展示了相同的错误:
我有一个这样的模型:
public class HomeModel
{
public string SomeText { get; set; }
public long SelectedItemId { get; set; }
public IEnumerable<SelectListItem> AvailableItems { get; set; }
}
提交模型实例的表单,如下所示:
@using(Html.BeginForm("Result", "Home", FormMethod.Get))
{
@Html.EditorFor(model => model.SomeText)
<br />
@Html.DropDownListFor(model => model.SelectedItemId, Model.AvailableItems)
<input type="submit" value="submit" />
}
还有一个显示细节的视图,就像这样
You Typed: @Html.DisplayFor(model => model.SomeText) <br />
You Selected: @Html.DisplayFor(model => model.SelectedItemId)
还有一个控制器来管理这一切:
public class HomeController : Controller
{
//
// GET: /Home/
public ActionResult Index()
{
HomeModel model = new HomeModel();
List<SelectListItem> items = new List<SelectListItem>();
for (int i = 0; i < 10; i++)
items.Add(new SelectListItem() { Value = i.ToString(), Text = i.ToString() });
model.AvailableItems = items;
return View(model);
}
public ActionResult Result(HomeModel model)
{
return View(model);
}
}
我填写表格,按提交。我被重定向到结果视图,一切都很好。
然后我在浏览器中按回,再次显示索引视图。
然后我再次提交表格,事情变糟了。尽管列表似乎显示了浏览器中先前选择的值,但模型并未使用我列表中的选定值重新填充。
字符串属性正在正确更新,这在我显示此行为的真实世界代码中是正确的。
这只发生在 IE 中,我使用的是版本 9。