如何不绑定特定Model将视图的FormData传递到控制器
问题修复方案
核心错误原因
你遇到的500报错由两个核心问题导致:
- 控制器方法加了
[ValidateAntiForgeryToken]防伪验证,但提交的表单中没有包含ASP.NET Core要求的防伪令牌字段,请求被验证拦截触发错误 - 你注释的业务代码中直接将
FormCollection类型的参数传入EF Core的Update方法,两者类型不匹配,执行时会抛出异常
具体修复步骤
1. 表单添加防伪令牌
在模态框视图的form标签内部添加防伪令牌生成代码,自动生成验证所需的隐藏字段:
<form method="post" id="ModalForm" action="@Model.SubmitFormUrl"> @Html.AntiForgeryToken() @Html.Raw(Model.body) </form>
2. 控制器接收与数据转换
FormCollection本身可以正常接收FormData提交的内容,只需要手动将字段映射到对应的业务实体,同时修正方法的异步声明:
[HttpPost] [ValidateAntiForgeryToken] // 原方法缺少async和Task声明,无法执行await操作,需修正 public async Task<IActionResult> Update(FormCollection form) { // 从FormCollection读取字段构造Page实体 var page = new Page() { Id = Guid.Parse(form["Id"]), pageName = form["pageName"], pageDescreption = form["pageDescreption"], pageHtmlContent = form["pageHtmlContent"] }; if (ModelState.IsValid) { try { context.Update(page); await context.SaveChangesAsync(); } catch (DbUpdateConcurrencyException) { throw; } return RedirectToAction(nameof(Index)); } return RedirectToAction(nameof(Index)); }
3. 修复视图笔误
模态框视图中<diav class="modal-content">为拼写错误,修改为<div class="modal-content">即可避免前端渲染异常。
通用场景优化
如果要适配任意类型模型提交的需求,可以使用ASP.NET Core自带的TryUpdateModelAsync方法动态绑定实体,不需要针对每个模型手动写字段映射逻辑:
var targetModel = new 你需要的实体类型(); await TryUpdateModelAsync(targetModel, "", form);
注:你当前的fetch提交代码不需要修改,不要手动设置Content-Type请求头,浏览器会自动为FormData请求携带正确的内容类型与边界值。
内容的提问来源于stack exchange,提问作者MOHAMED ABUELATTA
相关产品推荐
相关产品推荐

