2011-08-10 98 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>  
     } 

當表單提交時,我刪除標記爲要刪除的任何項目,然後用新的數據集返回視圖。

我所看到的是,即使刪除屬性的值設置爲,如果列表仍包含與帖子上刪除的行之一相同索引的項目,項目複選框被錯誤地選中假。

E.g. 3項目清單>刪除項目2>當視圖呈現時,將檢查列表中的第二項目。

的3項列表>除去項目3>沒有項目在所得視圖檢查

的4項列表>刪除項目1 & 2>的其餘項目都在所得視圖檢查

如果我刷新頁面,然後正確呈現,所以我通過執行RedirectToAction來強制GET視圖而不是僅從POST返回視圖,但想知道發生了什麼問題以及如何修復這適當。

下面是這兩個動作的實際代碼片段:

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我想知道的響應,如果有某種瀏覽器正在緩存檢查狀態並覆蓋我的視圖實際嘗試呈現的內容...

...或者這裏有一個真正簡單的錯誤,我錯過了盯着它太久!

回答

5

您需要從ModelState中刪除您在POST操作中修改的任何屬性,否則HTML助手仍將使用舊值。例如:

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

這就解決了問題,謝謝。爲什麼助手只爲這些檢查項目執行此操作?對其他字段的更改都可以正確顯示 - 只有顯示這個怪癖的複選框。 –

+0

@Chris W,這種行爲是通過設計=>所有HTML幫助者在模型中綁定值之後首先查看ModelState。此行爲不僅限於CheckBoxFor助手。 –

+0

討厭這個 - 很大的幫助,謝謝 –

相關問題