ASP.NET Core表单值无法正确传递至Action方法求助
问题分析与解决方案
核心问题
你的表单绑定的是EquipmentViewModel的属性,但Action方法接收的是独立参数,同时存在几个关键不匹配点:
- Razor视图未声明绑定的ViewModel类型,导致
asp-for生成的表单字段映射逻辑异常 - 直接使用独立参数接收表单数据,未利用ASP.NET Core的模型绑定特性适配Razor的表单生成规则
- 自定义路由的
{id?}参数属于URL路由范畴,与POST请求的表单数据无关,反而容易造成混淆
分步解决
1. 修正Razor视图,声明ViewModel类型
在Create.cshtml顶部添加@model指令,明确表单绑定的ViewModel:
@model WebApplication4.Controllers.EquipmentViewModel <div> <h2>Create Equipement</h2> <form asp-action="Create" method="post"> <div class="form-group"> <label asp-for="SalleId"></label> <input asp-for="SalleId" class="form-control" /> <span asp-validation-for="SalleId" class="text-danger"></span> </div> <div class="form-group"> <label asp-for="EquipmentName"></label> <input asp-for="EquipmentName" class="form-control" /> <span asp-validation-for="EquipmentName" class="text-danger"></span> </div> <button type="submit" class="btn btn-primary">Create</button> </form> </div>
2. 修改Action方法,直接接收ViewModel
将Action的参数改为EquipmentViewModel,让ASP.NET Core自动完成表单数据到模型的映射:
[HttpPost] public IActionResult Create(EquipmentViewModel model) { if (!ModelState.IsValid) { return View(model); // 返回视图展示验证错误 } // 验证SalleId是否存在 var salle = _context.Salles.FirstOrDefault(s => s.CodeSalle == model.SalleId); if (salle != null) { var equipement = new Equipement { SalleId = salle.CodeSalle, EquipmentName = model.EquipmentName }; _context.Equipements.Add(equipement); _context.SaveChanges(); // 采用PRG模式重定向,避免表单重复提交 return RedirectToAction("Index"); } else { // 添加自定义错误信息 ModelState.AddModelError("SalleId", "无效的SalleId"); return View(model); } }
3. 调整路由(可选,优化规范)
你定义的createEquipement路由更适合带ID的GET请求(如编辑场景),POST请求不需要该路由,建议移除并保留默认控制器路由:
// 移除自定义的createEquipement路由,保留默认路由即可 endpoints.MapControllerRoute( name: "default", pattern: "{controller=Home}/{action=Index}/{id?}");
验证要点
- 提交表单时打开浏览器开发者工具(F12),查看
Network标签下的POST请求,检查Form Data中是否包含SalleId和EquipmentName字段,且值与输入一致 - 确认ViewModel的命名空间正确,视图能正常引用该类
内容的提问来源于stack exchange,提问作者Windows 2000
相关产品推荐
相关产品推荐

