私は自分自身を繰り返すリスクを冒して、次の文で答えを始めます。
ASP.NET MVC アプリケーションでは常に、ビュー モデルを使用する必要があります。
そう:
public class MyViewModel
{
public string Name { get; set; }
public bool IsChecked { get; set; }
}
次にコントローラー:
public class HomeController : Controller
{
public ActionResult Index()
{
// Those are your domain models
// they could come from a database or something
var listA = new[] { "Item 1", "Item 2", "Item 3", "Item 4", "Item 5" };
var listB = new[] { "Item 1", "Item 2", "Item 3", "Item 4", "Item 5", "Item 6", "Item 7", "Item 8", "Item 9", "Item 10" };
// Now let's map our domain model to our view model
var model = listB.Select(x => new MyViewModel
{
Name = x,
IsChecked = listA.Contains(x)
});
return View(model);
}
[HttpPost]
public ActionResult Index(IEnumerable<MyViewModel> model)
{
var selectedItems = model.Where(x => x.IsChecked);
var format = string.Join(",", selectedItems.Select(x => x.Name));
return Content("Thank you for selecting " + format);
}
}
次に、対応するビュー ( ~/Views/Home/Index.cshtml
):
@model IEnumerable<MyViewModel>
@using (Html.BeginForm())
{
@Html.EditorForModel()
<button type="submit">OK</button>
}
最後に、モデル コレクションの各要素に対して自動的にレンダリングされる、対応するエディター テンプレート ( ~/Views/Home/EditorTemplates/MyViewModel.cshtml
):
@model MyViewModel
<div>
@Html.HiddenFor(x => x.Name)
@Html.LabelFor(x => x.IsChecked, Model.Name)
@Html.CheckBoxFor(x => x.IsChecked)
</div>
レンダリングされた結果 (Chrome ブラウザーで表示) は次のようになります。

ビュー モデルを使用すると、それがいかに簡単であるかがわかりますか?