Модель привязки IList только для выбранных элементов
-
19-09-2019 - |
Вопрос
У меня есть настройка метода действия:
public ActionResult Delete(IList<Product> products)
И таблица продуктов на мой взгляд.У меня работает привязка модели, поэтому при отправке я могу заполнить products
список.Но я хотел бы заполнить его только теми продуктами, которые выбраны с помощью флажка.
Я думаю, что мог бы сделать это, изменив метод действия на этот:
public ActionResult Delete(IList<Product> products, IList<int> toDelete)
И передавая список флажков в toDelete
но мне бы очень хотелось, если это возможно, избежать изменения сигнатуры метода.
Есть ли способ передать только выбранные элементы?Или мне придется написать собственный ModelBinder?
Решение
Я не понимаю, почему вы не хотите менять подпись, но если вы этого действительно не хотите, просто откройте 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"});
Другие советы
Вы всегда можете использовать значение флажка, чтобы указать, удалять элемент или нет.
Имя этого значения будет относиться к свойству вашего класса 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();