2011-08-10 8 views
1

本当に単純なビューにはチェックボックスを含む項目のリストがあるはずです。MVCチェックボックスリスト - 投稿後に間違ってチェックされた項目

@for (int i = 0; i < Model.ApiKeys.Count; i++) 
     { 
      <tr> 
       <td>@Html.TextBoxFor(m => m.ApiKeys[i].Name, new { @class = "api-input-150" })</td> 
       <td>@Html.CheckBoxFor(m => m.ApiKeys[i].Remove, new { @class = "api-input-50" })</td> 
      </tr>  
     } 

フォームがサブミットされると、削除するフラグが付いたアイテムが削除され、新しいデータセットでビューが返されます。

私が見ているのは、削除プロパティの値がに設定されているにもかかわらず、アイテムのチェックボックスが間違ってチェックされている投稿で削除された行と同じインデックスを持つアイテムがリストに含まれている場合です偽です。

など。 3項目のリスト> 2項目を削除>ビューのレンダリング時にリストの2番目の項目がチェックされます。 3つのアイテムの

リスト>項目3を除去>商品は、4つの項目の合成図

リストでチェックされていない>項目1 & 2を除去>残りの項目は、いずれも得られ鑑みて

をチェックされ私はページをリフレッシュすると正しくレンダリングされるので、RedirectToActionを実行してPOSTからビューを返すのではなく、GETを強制的に実行することで一時的に回避しましたが、何が起こっているのか、また修正する方法を知りたいと思いますこれは適切です。

public ActionResult Index() 
{ 
    return View(GetSettings()); 
} 

[HttpPost] 
public ActionResult Index(Model.Setup settings) 
{ 
    if (ModelState.IsValid) 
    { 
     SaveSettings(settings); 
     return View(GetSettings()); 
    } 
    else 
    { 
     return View(settings); 
    } 
} 

私の基礎となるデータがすべて正しく更新され、ブラウザのいくつかの種類があります場合にのみ、私は思ったんだけどPOSTからの応答で行われていることを考える:

ここでは、2つのアクションから実際のコードスニペットですチェックされた状態をキャッシュして、実際にレンダリングしようとしているものをオーバーライドしているプレイ中の機能...

...多分私はそれをあまりにも凝視していない本当の単純なエラーがあります!

答えて

5

ModelStateからPOSTアクション内で変更しているプロパティを削除する必要があります。そうしないと、HTMLヘルパーは引き続き古い値を使用します。例:

if (ModelState.IsValid) 
{ 
    ModelState.Clear(); 
    SaveSettings(settings); 
    return View(GetSettings()); 
} 
+0

これは問題を解決しました。なぜヘルパーはこれらのチェック項目のためにこれを行うのですか?他のフィールドの変更はすべて正しく表示されます。これはこのクォークを示すチェックボックスだけです。 –

+0

@Chris Wこの動作は設計上のものです。>すべてのHTMLヘルパーは、値をバインドするときとモデルの後でModelStateを最初に調べます。この動作は、CheckBoxForヘルパーにのみ限定されません。 –

+0

これは厄介なものです - 大きな助けをいただきました –