2009-11-16 61 views
1

我有一個由許多項目組成的表單(想想亞馬遜訂單上的訂單項目)。每行都有一個複選框與他們關聯,因此用戶可以選擇多個項目並單擊「刪除」。POST後的HTML.CheckBox持久狀態 - 刷新ModelState?

表單構建起來有點像這樣;

<% for (int i = 0; i < Model.OrderItems.Count; i++) { %> 
<tr> 
    <td><%= Html.Hidden(String.Format("OrderItems[{0}].Id", i), Model.OrderItems[i].Id)%> 
     <%= Html.CheckBox(String.Format("OrderItems[{0}].Checked", i), Model.OrderItems[i].Checked)%></td> 
    <td><%= Html.TextBox(String.Format("OrderItems[{0}].Name", i), Model.OrderItems[i].Name)%></td> 
    <td><%= Html.TextBox(String.Format("OrderItems[{0}].Cost", i), Model.OrderItems[i].Cost)%></td> 
    <td><%= Html.TextBox(String.Format("OrderItems[{0}].Quantity", i), Model.OrderItems[i].Quantity)%></td> 
</tr>  
<% } %> 

模型聯編程序完成它的魔術並且列表被正確填充。但是,在處理操作中的請求(例如,移除適當的項目)並返回包含更少項目的新視圖之後,表單狀態將保持「半」狀態。即使在編輯模型中所有的布爾值都設置爲false,仍然會檢查一些複選框。

我沒有這個問題,如果我返回RedirectToActionResult,但使用它作爲解決方案似乎有點冒險的工作。

我想我需要刷新/刷新模型狀態,或類似的東西,但我不確定搜索條件來找出如何。

回答

0

如果您檢查呈現的HTML,我認爲您會發現與您的複選框同名的隱藏輸入;這是HTML.Checkbox的工作方式。它會導致提交一系列值。

這可能是您的問題的原因。

善良,

+0

是的,我明白了 - 但爲什麼這個狀態會記住不同的請求呢? – Kirschstein 2009-11-16 14:45:41

0

我想看到你的控制器代碼,但認爲你是視圖模型是由公約的事實填補。

在你的索引操作中,我猜你創建了一個新的viewModel。嘗試用不同的名稱,調用實例indexViewModel說,它不會自動收集以前的viewModel數據。

0

你的預感是可能是正確的,你可能需要調用

ModelState.Remove("OrderItems[{0}].Checked"); 

BTW使用重定向通常不被認爲是一個黑客,它實際上是相當一個叫後重定向獲取(PRG)好的做法。