表单值未传递至控制器:ASP.NET MVC提交List<SampleVM>为空问题
问题分析与解决方案
核心问题
List
- 控制器方法参数存在语法错误
- 表单字段的
name属性格式不符合ASP.NET MVC集合绑定规则,且前缀与参数名不匹配
步骤1:修正控制器方法参数语法
你的SaveSamples方法参数写法有误,正确的泛型List定义如下:
[HttpPost] [ValidateAntiForgeryToken] public ActionResult SaveSamples(List<SampleVM> samples) // 修正泛型语法错误 { if (ModelState.IsValid) { Sample sample = new Sample(); db.Samples.Add(sample); db.SaveChanges(); // 补充保存数据的操作 return RedirectToAction("Create"); } return View(samples); }
步骤2:修正表单字段的name属性格式
ASP.NET MVC的集合绑定要求字段遵循索引式命名规则,才能正确识别集合中的每一项。结合你的场景,推荐以下可靠方案:
方案:修改分部视图,生成符合绑定规则的name属性
在FilterAttributes.cshtml分部视图中,循环渲染每个属性项时,显式指定参数前缀samples和索引,确保生成的字段name匹配控制器的集合参数:
@model IEnumerable<IQC.ViewModels.SampleVM> @{ var index = 0; } @foreach (var item in Model) { <tr> <td> @Html.Hidden("samples[" + index + "].SpecificationAttributeId", item.SpecificationAttributeId) </td> <td> @Html.Hidden("samples[" + index + "].AttributeId", item.AttributeId) </td> <td> @Html.TextBox("samples[" + index + "].Value", item.Value) </td> </tr> index++; }
修改后生成的字段name会是samples[0].SpecificationAttributeId、samples[1].AttributeId这类格式,模型绑定器能准确识别并绑定到List<SampleVM> samples参数中。
额外修正点
你的JavaScript代码存在语法错误,拼接queryString时的=应该改为+:
var queryString = url + '?specificationName=' + specificationName + '&lotId=' + lotId;
内容的提问来源于stack exchange,提问作者Eric
相关产品推荐
相关产品推荐

