You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何不绑定特定Model将视图的FormData传递到控制器

问题修复方案

核心错误原因

你遇到的500报错由两个核心问题导致:

  1. 控制器方法加了[ValidateAntiForgeryToken]防伪验证,但提交的表单中没有包含ASP.NET Core要求的防伪令牌字段,请求被验证拦截触发错误
  2. 你注释的业务代码中直接将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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.10.11 04:27:01