So, I have such a controller:
public class TestController : Controller { // // GET: /Test/ public ActionResult Index() { return View("Test"); } public ActionResult Post(IList<Test> LanguageStrings, IList<Test> LanguageStringsGroup, IList<string> Deleted, IList<string> DeletedGroup) { if (LanguageStrings == null) { throw new ApplicationException("NULL"); } return View("Test"); } } public class Test { public string Val { get; set; } public string Another { get; set; } }
And here is a view:
<h2>Test</h2> @using (Html.BeginForm("Post", "Test")) { @Html.Hidden("LanguageStrings[0].Val", "test1") @Html.Hidden("LanguageStrings[0].Another") @Html.Hidden("LanguageStrings[1].Val", "test2") @Html.Hidden("LanguageStrings[1].Another") @Html.Hidden("LanguageStringsGroup[0].Val", "test4") @Html.Hidden("Deleted[0]") @Html.Hidden("Deleted[1]") @Html.Hidden("Deleted[2]") @Html.Hidden("DeletedGroup[0]") <button>Post</button> }
When I submit the form, my controller throws an exception because LanguageStrings is null. The strange part that I mentioned in the title is that if I add another entry to the list, everything will work. Like this:
<h2>Test</h2> @using (Html.BeginForm("Post", "Test")) { @Html.Hidden("LanguageStrings[0].Val", "test1") @Html.Hidden("LanguageStrings[0].Another") @Html.Hidden("LanguageStrings[1].Val", "test2") @Html.Hidden("LanguageStrings[1].Another") @Html.Hidden("LanguageStrings[2].Val", "test3") @Html.Hidden("LanguageStrings[2].Another") @Html.Hidden("LanguageStringsGroup[0].Val", "test4") @Html.Hidden("Deleted[0]") @Html.Hidden("Deleted[1]") @Html.Hidden("Deleted[2]") @Html.Hidden("DeletedGroup[0]") <button>Post</button> }
It also works when I delete the Deleted Items list. Like this:
<h2>Test</h2> @using (Html.BeginForm("Post", "Test")) { @Html.Hidden("LanguageStrings[0].Val", "test1") @Html.Hidden("LanguageStrings[0].Another") @Html.Hidden("LanguageStrings[1].Val", "test2") @Html.Hidden("LanguageStrings[1].Another") @Html.Hidden("LanguageStringsGroup[0].Val", "test4") @Html.Hidden("DeletedGroup[0]") <button>Post</button> }
This has something to do with the name I use. I already solved the problem of renaming LanguageStrings to something else. But I would like to understand what is happening here, because, probably, I could learn something from him, how MVC cards request the body and can avoid such labor-intensive problems. Please help me and explain the reason for this.