Вместо того, чтобы визуализировать чекбоксы самостоятельно, вы должны позволить MVC справиться с этим, используя Html.CheckBoxFor(m => ...)
. MVC будет генерировать имена элементов формы, которые точно соответствуют потребностям при анализе проанализированных данных, что очень трудно сделать для себя.
Кроме того, для рендеринга флажка таким образом вам необходимо иметь свойство bool
в вашей ViewModel, но оно отсутствует.
Далее следует рабочий код (фактически проверенный).
(Прежде чем мы продолжим, еще одна существенная вещь: не используйте foreach
, как указано в комментарии выше. Причина: MVC CheckBoxFor()
только генерирует правильные имена элементов формы (которые могут быть проанализированы с помощью MVC снова), если вы используете for
+ [indexes] на всех уровнях ViewModel, тогда как эта способность развалится, если вы будете использовать foreach
на любом уровне. MVC нуждается и использует эти номера индексов.)
Контроллер:
using System.Collections.Generic;
using System.Linq;
using System.Web.Mvc;
namespace Test_MVC.Controllers
{
public class TestController : Controller
{
[HttpGet]
public ActionResult Index()
{
// Create some data for initial display
var packageModels1 = new[] {
new PackageDetailsViewModel { packages_id = 101, package_title = "Order 101", is_selected = false },
new PackageDetailsViewModel { packages_id = 102, package_title = "Order 102", is_selected = true },
new PackageDetailsViewModel { packages_id = 103, package_title = "Order 103", is_selected = false }
};
var packageModels2 = new[] {
new PackageDetailsViewModel { packages_id = 201, package_title = "Order 201", is_selected = false },
new PackageDetailsViewModel { packages_id = 202, package_title = "Order 202", is_selected = false }
};
var couponModels = new[] {
new Provider_Coupon_FullViewModel { cid = 1, crid = 2, opr_user = "John", pid = 4, PackageDetails = packageModels1.ToList() },
new Provider_Coupon_FullViewModel { cid = 7, crid = 8, opr_user = "Beth", pid = 6, PackageDetails = packageModels2.ToList() }
};
return View(couponModels.ToList());
}
[HttpPost]
public ActionResult Index(List<Provider_Coupon_FullViewModel> model)
{
// Pass whatever was posted & parsed right back into the view for verification
return View(model);
}
}
}
Классы ViewModel:
public class Provider_Coupon_FullViewModel
{
public int pid { get; set; }
public int cid { get; set; }
public int crid { get; set; }
public string opr_user { get; set; }
public List<PackageDetailsViewModel> PackageDetails { get; set; }
}
public class PackageDetailsViewModel
{
public int packages_id { get; set; }
public string package_title { get; set; }
public bool is_selected { get; set; } /////// <--- BOOL PROPERTY <--- ///////
}
Razor View:
@model IList<Provider_Coupon_FullViewModel>
@using (Html.BeginForm())
{
for (var i = 0; i < Model.Count; i++)
{
<div style="border: dashed 1px blue; margin: 5px; padding: 5px">
pid: @Html.EditorFor(Model => Model[i].pid)<br />
cid: @Html.EditorFor(Model => Model[i].cid)<br />
crid: @Html.EditorFor(Model => Model[i].crid)<br />
@*I want show checkbox for list of viewmodel and pass value of them if check box checked*@
@for (int j = 0; j < Model[i].PackageDetails.Count; j++)
{
<div class="">
i = @i / j = @j / ID: @Html.DisplayFor(m => Model[i].PackageDetails[j].packages_id) / Title: @Html.DisplayFor(m => Model[i].PackageDetails[j].package_title) /
@Html.CheckBoxFor(m => Model[i].PackageDetails[j].is_selected)
@Html.LabelFor(m => Model[i].PackageDetails[j].is_selected)
</div>
}
</div>
}
<input type="submit" value="Submit" />
}