我有一个相当简单的剃须刀视图,需要用于问卷调查,在问题用完之前反复使用。复选框用于选择答案,问题是当我第一次提交表单时,下一组问题返回我第一次提交的答案将保留在第二页。为简单起见,我将程序简化如下,
模型,
public class CheckBoxItemDto
{
public int Id { get; set; }
public bool Selected { get; set; }
}
public class CheckBoxModel
{
public CheckBoxModel()
{
Dtos = new List<CheckBoxItemDto>();
}
public IList<CheckBoxItemDto> Dtos { get; set; }
}
控制器,
public class CheckBoxController : Controller
{
public ViewResult Index()
{
CheckBoxModel model = new CheckBoxModel();
for (int i = 0; i < 5; i++)
{
model.Dtos.Add(new CheckBoxItemDto(){Id = i,Selected = true});
}
return View(model);
}
[HttpPost]
public ViewResult Index(CheckBoxModel mdl)
{
CheckBoxModel model = new CheckBoxModel();
for (int i = 5; i < 10; i++)
{
model.Dtos.Add(new CheckBoxItemDto() { Id = i, Selected = i % 2 == 0 });
}
return View(model);
}
}
查看,
@model CheckBoxTest.Models.CheckBoxModel
@{
ViewBag.Title = "ViewPage1";
}
<h2>ViewPage1</h2>
@using (Html.BeginForm())
{
for (int i = 0; i < Model.Dtos.Count; i++)
{
@Html.DisplayFor(m => m.Dtos[i].Id)
@Html.DisplayFor(m => m.Dtos[i].Selected)
@Html.CheckBoxFor(m => m.Dtos[i].Selected)
<br/>
}
<input type="submit" value="Index" />
}
在post后的视图中,DisplayFor和CheckBoxFor列的值不同。但它应该是一样的。
答案 0 :(得分:10)
听到它的声音,当您返回视图时,ModelState
仍然保持其先前的值。尝试清除帖子中的ModelState
:
ModelState.Clear();
CheckBoxModel model = new CheckBoxModel();
...
答案 1 :(得分:1)
在为POST运行的Index
操作方法中,ASP.Net MVC期望生成的View显示验证错误。因此,HTML Helper方法CheckBoxFor
会在ModelState
之前的Model
中查找,因此它可以向用户显示“无效”值。
如果您没有使用POST操作中的View来显示错误,则可以将ModelState清除为Dangerous suggests。或者,您可以使用“Post-Redirect-Get”模式:在POST操作方法中,如果有错误则显示相同的View,或者重定向到显示其他内容的GET视图。