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?

Foi útil?

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();
Licenciado em: CC-BY-SA com atribuição
Não afiliado a StackOverflow
scroll top