MVC3复选框值不会清除

时间:2012-02-08 12:50:34

标签: c# asp.net-mvc-3 razor

我有一个相当简单的剃须刀视图,需要用于问卷调查,在问题用完之前反复使用。复选框用于选择答案,问题是当我第一次提交表单时,下一组问题返回我第一次提交的答案将保留在第二页。为简单起见,我将程序简化如下,

模型,

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列的值不同。但它应该是一样的。

2 个答案:

答案 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视图。