2012-02-08 85 views
2

我有一個相當直接的剃鬚刀視圖,需要用於調查問卷,這個問題可以反覆使用,直到用完問題。複選框用於選擇答案,問題是當我第一次提交表單時,當下一組問題返回時,我第一次提交的答案將保留在第二頁。爲簡單起見,我已經減少了程序如下,MVC3複選框值不會清除

模型,

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" /> 
} 

在交,DisplayFor和之後的視圖CheckBoxFor列值不同。但它應該是一樣的。

回答

8

通過它的聲音,當您返回視圖時,您的ModelState仍然保持其先前的值。嘗試在您的文章行動清除ModelState

ModelState.Clear(); 
CheckBoxModel model = new CheckBoxModel(); 
... 
+0

工程就像一個魅力。謝謝。 – 2012-02-09 05:20:46

1

在你Index操作方法獲取一個運行後,ASP.Net MVC期待得到的視圖來顯示驗證錯誤。因此,HTML助手方法CheckBoxForModel之前查找ModelState,因此它可以向用戶顯示「無效」值。

如果您未使用POST操作中的視圖來顯示錯誤,則可以將ModelState清除爲Dangerous suggests。或者,您可以使用「Post-Redirect-Get」模式:在您的POST操作方法中,如果出現錯誤,則顯示相同的視圖,否則重定向到顯示其他內容的GET視圖。