نموذج ملزم ilist من العناصر المحددة فقط
-
19-09-2019 - |
سؤال
لدي إعداد طريقة العمل:
public ActionResult Delete(IList<Product> products)
وجدول المنتجات في رأيي. لقد حصلت على نموذج ملزم يعمل بحيث على إرسال يمكنني ملء products
قائمة. ولكن أود أن أملكه مع المنتجات المحددة فقط عبر مربع اختيار.
أعتقد أنني أستطيع القيام بذلك عن طريق تغيير طريقة العمل إلى هذا:
public ActionResult Delete(IList<Product> products, IList<int> toDelete)
وإصدار قائمة خانات الاختيار إلى toDelete
ولكن أود حقا تجنب تغيير توقيع الطريقة إذا كان ذلك ممكنا.
هل هناك طريقة لتمرير العناصر المحددة فقط؟ أو سأضطر إلى كتابة moderbinder مخصص؟
المحلول
أنا لا أفهم لماذا لا ترغب في تغيير التوقيع، ولكن إذا كنت لا تفعل ذلك حقا، فما عليك سوى الوصول إلى 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"});
نصائح أخرى
يمكنك دائما استخدام قيمة مربع الاختيار للإشارة إلى ما إذا كنت تريد حذف العنصر أم لا.
يرتبط اسم هذه القيمة بممتلكات في فئة المنتج الخاصة بك.
<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>
ثم، عندما تصل إلى حذفك ()، يمكنك القيام بشيء مثل:
products = products.Where(x=>x.ToDelete == false).ToList();