Modelo Encuadernación un IList de los elementos seleccionados solamente
-
19-09-2019 - |
Pregunta
Tengo una configuración de métodos de acción:
public ActionResult Delete(IList<Product> products)
Y una tabla de productos en mi opinión. Tengo modelo de unión trabajando para que en Enviar puedo rellenar la lista products
. Pero me gustaría llenarla con sólo los productos que se seleccionan a través de una casilla de verificación.
Creo que podría hacerlo cambiando el método de acción a esto:
public ActionResult Delete(IList<Product> products, IList<int> toDelete)
Y que pasa a la lista de casillas de verificación a la toDelete
pero realmente me gustaría para evitar el cambio de la firma del método, si es posible.
¿Hay una manera de pasar sólo los elementos seleccionados? O voy a tener que escribir una ModelBinder personalizada?
Solución
No entiendo por qué no quiere cambiar la firma, pero si realmente no, basta con acceder ViewData [ "toDelete"] o
int[] toDelete;
UpdateModel(toDelete, "toDelete");
o
public class FormViewModel {
IList<Product> Products {get;set;}
int[] ToDelete {get;set;}
}
var viewmodel = new FormViewModel();
UpdateModel(viewmodel, new[]{"Products", "ToDelete"});
Otros consejos
Siempre se puede utilizar el valor de la casilla para indicar si desea eliminar el elemento o no.
El nombre de este valor se relacionaría con una propiedad en su clase de productos.
<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>
Entonces, cuando llegue a su eliminación (), usted podría hacer algo como:
products = products.Where(x=>x.ToDelete == false).ToList();