Modèle de liaison IList d'une sélection d'articles
-
19-09-2019 - |
Question
J'ai une configuration de la méthode d'action:
public ActionResult Delete(IList<Product> products)
Et une table de produits, à mon avis. J'ai modèle de liaison de travail afin que je puisse le soumettre compléter la liste products
. Mais je voudrais le remplir avec uniquement les produits qui sont sélectionnés via une case à cocher.
Je pense que je pourrais le faire en changeant la méthode d'action à ceci:
public ActionResult Delete(IList<Product> products, IList<int> toDelete)
Et en passant la liste des cases à cocher au toDelete
mais je voudrais vraiment éviter de changer la signature de la méthode si possible.
Y at-il un moyen de transmettre uniquement les éléments sélectionnés? Ou vais-je devoir écrire un ModelBinder personnalisé?
La solution
Je ne comprends pas pourquoi vous ne voulez pas changer la signature, mais si vous ne vraiment pas, l'accès juste 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"});
Autres conseils
Vous pouvez toujours utiliser la valeur de case à cocher pour indiquer si vous souhaitez supprimer l'élément ou non.
Le nom de cette valeur concernerait une propriété dans votre catégorie de produits.
<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>
Alors, quand vous arrivez à votre Delete (), vous pouvez faire quelque chose comme:
products = products.Where(x=>x.ToDelete == false).ToList();