2

我有一个动作方法设置:

public ActionResult Delete(IList<Product> products)

在我看来,还有一张产品表。我已经让模型绑定工作,因此在提交时我可以填充products列表。但我想只用通过复选框选择的产品填充它。

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

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

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

有没有办法只传递选定的项目?还是我必须编写一个自定义 ModelBinder?

4

2 回答 2

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();
于 2009-10-02T10:04:11.007 回答
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"});
于 2009-10-02T18:31:59.427 回答