Модель привязки IList только для выбранных элементов

StackOverflow https://stackoverflow.com/questions/1507343

  •  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();
Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top