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

ASP.NET Core MVC表单报错:无法覆盖form的action属性

问题原因

你遇到的InvalidOperationException错误,根源在于<form>标签同时使用了原生HTML的action属性和ASP.NET Core MVC的Tag Helper属性asp-action="Edit"。

ASP.NET Core的表单Tag Helper(asp-action、asp-controller等)会自动根据路由规则生成表单的action属性值,手动指定的action属性会和Tag Helper的生成逻辑冲突,框架不允许这种重复定义的情况。

解决方案

移除<form>标签中手动添加的action="Edit"属性,只保留asp-action="Edit"即可。Tag Helper会自动帮你生成正确的表单提交路径。

修改后的表单代码片段:

<form asp-action="Edit">
    <div class="modal-body">
        <div asp-validation-summary="ModelOnly" class="text-danger"></div>
        <div class="form-group">
            <label asp-for="ID" class="control-label"></label>
            <input asp-for="ID" class="form-control" />
            <span asp-validation-for="ID" class="text-danger"></span>
        </div>
        <!-- 其他表单字段 -->
    </div>
</form>

如果需要明确指定控制器,还可以补充asp-controller属性,确保路由生成准确:

<form asp-controller="Home" asp-action="Edit">
额外优化建议
  1. 完善控制器方法:你当前只有HttpGet的Edit方法,还需要添加HttpPost方法处理表单提交,否则提交后会出现404错误:
[HttpPost]
[ValidateAntiForgeryToken]
public async Task<IActionResult> Edit(RosterModel model)
{
    if (ModelState.IsValid)
    {
        db.Roster.Update(model);
        await db.SaveChangesAsync();
        return RedirectToAction(nameof(Index));
    }
    return View(model);
}
  1. 优化Get方法逻辑:原代码中await db.Roster.SelectAsync();属于冗余操作,Find/FindAsync会直接从数据源获取目标记录,无需提前查询全部数据,修改后:
[HttpGet]
public async Task<IActionResult> Edit(int id)
{
    var model = await db.Roster.FindAsync(id);
    if (model == null)
    {
        return NotFound();
    }
    return View(model);
}

内容的提问来源于stack exchange,提问作者user22019322

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.18 05:22:54