Модель, связывающая IList только с выбранными элементами - PullRequest
2 голосов
/ 02 октября 2009

У меня есть настройка метода действия:

public ActionResult Delete(IList<Product> products)

И таблица продуктов на мой взгляд. У меня работает Model Binding, поэтому при отправке я могу заполнить список products. Но я хотел бы заполнить его только теми продуктами, которые выбраны с помощью флажка.

Думаю, я мог бы сделать это, изменив метод действия следующим образом:

public ActionResult Delete(IList<Product> products, IList<int> toDelete)

И передать список флажков на toDelete, но я бы очень хотел избежать изменения сигнатуры метода, если возможно.

Есть ли способ пропустить только выбранные предметы? Или мне придется написать собственный ModelBinder?

Ответы [ 2 ]

2 голосов
/ 02 октября 2009

Вы всегда можете использовать значение флажка, чтобы указать, удалять элемент или нет.

Имя этого значения будет относиться к свойству в вашем классе продукта.

<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();
1 голос
/ 02 октября 2009

Я не понимаю, почему вы не хотите менять подпись, но если вы действительно этого не хотите, просто обратитесь к 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"});
...