我有一个动作方法设置:
public ActionResult Delete(IList<Product> products)
我认为这是一个产品表。我有模型绑定工作,所以在提交时我可以填充products
列表。但我想只用通过复选框选择的产品填充它。
我想我可以通过将动作方法更改为:
来实现public ActionResult Delete(IList<Product> products, IList<int> toDelete)
并将复选框列表传递给toDelete
,但我真的希望尽可能避免更改方法签名。
有没有办法只传递选定的项目?或者我是否必须编写自定义的ModelBinder?
答案 0 :(得分: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>
然后,当你到达Delete()时,你可以做类似的事情:
products = products.Where(x=>x.ToDelete == false).ToList();
答案 1 :(得分:1)
我不明白为什么你不想改变签名,但如果你真的不想,只需访问ViewData [“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"});