2009-10-02 2 views
2

У меня есть настройки метода действия:модель связывания IList выбранных элементов только

public ActionResult Delete(IList<Product> products) 

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

Я думаю, что я мог бы сделать это путем изменения способа действий к этому:

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

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

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

ответ

1

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

Не то, чтобы я * не могу прикоснуться к подписи, это то, чего я действительно не хочу. Если вы прочитали метод, который говорит «Удалить (IList ), вы сразу же узнаете, что он удалит продукты в этом списке. Немного назад для чтения 'Удалить (IList продуктов, int [] toDelete)' или аналогичный. Возможно, у меня может быть игра со вторым предложением, хотя и приветствуется. – jeef3

+0

После долгих размышлений я закончил тем, что изменил подпись метода, чтобы добавить whitelsit. Я начал создавать пользовательскую привязку модели, но это слишком долгое время, и мне действительно нужно было настаивать на этом. Если я получу время, я снова смогу заглянуть в обычную модель. – jeef3

2

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

Имя этого значения будет относиться к собственности в вашем классе 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(); 
+0

Это был бы аккуратный способ сделать это, и я попытался найти свойство, к которому я могу добавить такой флаг. К сожалению, я не могу коснуться модели. – jeef3

+0

Вы всегда можете унаследовать от модели и использовать специальный ViewModel, который добавляет это поле? Тогда, поскольку они используют один и тот же базовый класс, когда вы передаете свой подкласс, ваше поле ничего не повлияет? – Yablargo