模型仅绑定选定项目的IList

时间:2009-10-02 01:19:17

标签: asp.net-mvc model-binding

我有一个动作方法设置:

public ActionResult Delete(IList<Product> products)

我认为这是一个产品表。我有模型绑定工作,所以在提交时我可以填充products列表。但我想只用通过复选框选择的产品填充它。

我想我可以通过将动作方法更改为:

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

并将复选框列表传递给toDelete,但我真的希望尽可能避免更改方法签名。

有没有办法只传递选定的项目?或者我是否必须编写自定义的ModelBinder?

2 个答案:

答案 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"});