2012-02-08 14 views
2

私は、質問がなくなるまで繰り返し使用されるアンケートに使用する必要がある、かなり簡単な剃刀のビューを持っています。チェックボックスは選択された回答に使用されますが、問題は次回の質問が返されたときに最初にフォームを送信したときです。最初に送信した回答が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をクリアしてみてください。

POSTのために実行しますあなたの Indexアクションメソッドで
ModelState.Clear(); 
CheckBoxModel model = new CheckBoxModel(); 
... 
+0

魅力的な作品です。ありがとうございました。 –

1

、ASP.Net MVCは、検証エラーを表示するには、結果の表示を期待しています。したがって、HTMLヘルパメソッドCheckBoxForは、Modelの前にModelStateを検索するため、ユーザーに無効な値を表示することができます。

POSTアクションからビューを使用してエラーを表示していない場合は、ModelStateをDangerous suggestsとしてクリアすることができます。または、POSTアクションメソッドで、エラーがある場合は同じビューを表示し、そうでない場合は別のものを表示するGETビューにリダイレクトする、「ポストリダイレクト取得」パターンを使用することもできます。

関連する問題