Below is an example that illustrates basic HTML forms and the naming convention used by the model binder. The post method return JSON which is intended to show the data format - for testing.
using Microsoft.AspNetCore.Mvc;
using MvcDemo.Models;
namespace MvcDemo.Controllers
{
public class CheckController : Controller
{
[HttpGet]
public IActionResult Index()
{
return View();
}
[HttpPost]
public IActionResult Index(List<int> selectedItems)
{
return Ok(selectedItems);
}
[HttpGet]
public IActionResult ComplexEx()
{
return View();
}
[HttpPost]
public IActionResult ComplexEx(ComplexOneLevelVm model)
{
return Ok(model);
}
[HttpGet]
public IActionResult Complex2Ex()
{
return View();
}
[HttpPost]
public IActionResult Complex2Ex(ComplexTwoLevelVm model)
{
return Ok(model);
}
}
}
Models
public class ComplexOneLevelVm
{
public string? Name { get; set; }
public List<int>? selectedItems { get; set; }
}
public class ComplexTwoLevelVm
{
public string? TopLevelName { get; set;}
public ComplexOneLevelVm? NestedComplexType { get; set;}
}
Index.cshtml
@{
ViewData["Title"] = "Index";
}
<h1>Index</h1>
<div>
<form method="post">
1: <input type="checkbox" name="selectedItems" value="1" /><br />
2: <input type="checkbox" name="selectedItems" value="2" /><br />
3: <input type="checkbox" name="selectedItems" value="3" /><br />
4: <input type="checkbox" name="selectedItems" value="4" /><br />
5: <input type="checkbox" name="selectedItems" value="5" /><br />
6: <input type="checkbox" name="selectedItems" value="6" /><br />
7: <input type="checkbox" name="selectedItems" value="7" /><br />
<div>
<input type="submit" name="submit" value="submit" />
</div>
</form>
</div>
ComplexEx.cshtml
@model MvcDemo.Models.ComplexOneLevelVm
@{
ViewData["Title"] = "ComplexEx";
}
<h1>ComplexEx</h1>
<form method="post">
Name: <input type="text" name="Name" /><br />
1: <input type="checkbox" name="selectedItems" value="1" /><br />
2: <input type="checkbox" name="selectedItems" value="2" /><br />
3: <input type="checkbox" name="selectedItems" value="3" /><br />
4: <input type="checkbox" name="selectedItems" value="4" /><br />
5: <input type="checkbox" name="selectedItems" value="5" /><br />
6: <input type="checkbox" name="selectedItems" value="6" /><br />
7: <input type="checkbox" name="selectedItems" value="7" /><br />
<div>
<input type="submit" name="submit" value="submit" />
</div>
</form>
Complex2Ex.cshtml
@model MvcDemo.Models.ComplexTwoLevelVm
@{
ViewData["Title"] = "Complex2Ex";
}
<h1>Complex2Ex</h1>
<h4>ComplexTwoLevelVm</h4>
<hr />
<div>
<form method="post">
<div>
TopLevelName: <input type="text" name="TopLevelName" /><br />
</div>
<div style="margin-top:100px;">
Name: <input type="text" name="NestedComplexType.Name" /><br />
1: <input type="checkbox" name="NestedComplexType.selectedItems" value="1" /><br />
2: <input type="checkbox" name="NestedComplexType.selectedItems" value="2" /><br />
3: <input type="checkbox" name="NestedComplexType.selectedItems" value="3" /><br />
4: <input type="checkbox" name="NestedComplexType.selectedItems" value="4" /><br />
5: <input type="checkbox" name="NestedComplexType.selectedItems" value="5" /><br />
6: <input type="checkbox" name="NestedComplexType.selectedItems" value="6" /><br />
7: <input type="checkbox" name="NestedComplexType.selectedItems" value="7" /><br />
</div>
<div>
<input type="submit" name="submit" value="submit" />
</div>
</form>
</div>
Example of the Browser's Network utility in Developer Tools.
As you can see the model binder uses a naming convention that maps the input names to the C# types. When you manually build the HTML, as you are doing, then you have to follow the naming rules. You can't make up your own naming rules - programming does not work that way.
I recommend that you use the asp-for helper which will render the correct input names.
Note: only the checkboxes that are checked are submitted.