Model Binding um IList de itens selecionados somente
-
19-09-2019 - |
Pergunta
Eu tenho uma configuração de método de ação:
public ActionResult Delete(IList<Product> products)
E uma tabela de produtos em minha vista. Eu tenho Model Binding trabalhando para que em enviar posso preencher a lista products
. Mas eu gostaria de preenchê-lo com apenas os produtos que são selecionados por meio de uma caixa de seleção.
Eu acho que eu poderia fazê-lo, alterando o método de ação a esta:
public ActionResult Delete(IList<Product> products, IList<int> toDelete)
E passando a lista de caixas de seleção ao toDelete
mas eu realmente gostaria de evitar alterar a assinatura do método, se possível.
Existe uma maneira de passar apenas os itens selecionados? Ou vou ter que escrever uma ModelBinder personalizado?
Solução
Eu não entendo por que você não deseja alterar a assinatura, mas se você realmente não, apenas o acesso ViewData [ "toDelete"] ou
int[] toDelete;
UpdateModel(toDelete, "toDelete");
ou
public class FormViewModel {
IList<Product> Products {get;set;}
int[] ToDelete {get;set;}
}
var viewmodel = new FormViewModel();
UpdateModel(viewmodel, new[]{"Products", "ToDelete"});
Outras dicas
Você pode sempre usar o valor caixa de seleção para indicar se deseja excluir o item ou não.
O nome deste valor seria relativo a uma propriedade em sua classe de produtos.
<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>
Então, quando você chegar ao seu Delete (), você poderia fazer algo como:
products = products.Where(x=>x.ToDelete == false).ToList();