2009-10-02 41 views
2

我有一個動作方法設置:模型綁定所選項目的一個IList只有

public ActionResult Delete(IList<Product> products) 

和產品在我看來,一個表。我有模型綁定工作,以便提交我可以填充products列表。但是我想僅填充通過複選框選擇的產品。

我想我可以通過改變操作方法,以該做的:

public ActionResult Delete(IList<Product> products, IList<int> toDelete) 

和傳球複選框列表到toDelete,但我真的想避免可能的話改變方法簽名。

有沒有辦法只通過選定的項目?或者我將不得不編寫一個定製的ModelBinder?

回答

1

我不明白你爲什麼不想更改簽名,但如果你真的沒有,只是訪問計算機[ 「toDelete」]或

int[] toDelete; 
UpdateModel(toDelete, "toDelete"); 

public class FormViewModel { 
    IList<Product> Products {get;set;} 
    int[] ToDelete {get;set;} 
} 

var viewmodel = new FormViewModel(); 
UpdateModel(viewmodel, new[]{"Products", "ToDelete"}); 
+0

這並不是說我*不能*觸摸簽名,這是我不想要的。如果您閱讀了一種說法:刪除(IList 產品),您立即知道它會刪除該列表中的產品。稍微向後讀一下'Delete(IList products,int [] toDelete)'或類似的東西。 雖然我可能會玩你的第二個建議,歡呼聲。 – jeef3 2009-10-04 09:59:56

+0

經過深思熟慮,我最終改變了方法簽名以添加一個白名單。我開始製作一個定製的模型綁定器,但這需要花費很長時間,我真的需要從這個方面繼續努力。如果我有時間,我可以再次查看自定義模型聯編程序。 – jeef3 2009-10-04 23:28:19

2

您可以隨時使用複選框值指示是否刪除該項目。

該值的名稱將與您的Product類中的屬性相關。

<form> 
    <% for(int i = 0; i < products.Count) { %> 
     <div> 
     <input type="hidden" name='<%=string.Format("products[{0}].Property1", i) %>' value='<%= products[i].Property1 %>' /> 
     <input type="hidden" name='<%=string.Format("products[{0}].Property2", i) %>' value='<%= products[i].Property2 %>' /> 
     <input type="hidden" name='<%=string.Format("products[{0}].Property3", i) %>' value='<%= products[i].Property3 %>' /> 
     <input type="checkbox" name='<%=string.Format("products[{0}].ToDelete", i) %>' value='true' /> 
     </div> 
    <% } %> 
</form> 

然後,當您到達刪除(),你可以這樣做:

products = products.Where(x=>x.ToDelete == false).ToList(); 
+0

這將是一個乾淨的做法,我試圖找到一個屬性,我可以附上這樣的標誌了。不幸的是我無法觸摸模型。 – jeef3 2009-10-04 09:57:05

+0

您可以始終從模型繼承並使用添加此字段的特殊ViewModel?那麼既然他們使用相同的基類,當你傳入你的子類時,你的字段不會影響任何東西? – Yablargo 2012-01-31 22:44:09

相關問題