ASP.NET无法访问控制器中的Action问题求助
看起来你遇到了表单提交后没触发目标POST Action,反而跳回GET路由页面的问题,我来帮你梳理几个可能的原因和解决办法:
先排查ModelState验证失败的情况
你的代码里做了ModelState.IsValid判断,如果验证不通过就会返回原视图,这时候看起来像是回到了GET的页面。你可以先检查Mission模型的验证规则:- 比如模型里的
Title、Label字段有没有添加[Required]这类数据注解?虽然表单加了前端的required属性,但服务器端的ModelState验证才是决定是否执行保存逻辑的关键,如果模型没有对应注解,或者有其他验证规则(比如长度限制)没满足,都会导致ModelState.IsValid为false,进而返回视图。 - 你可以在POST Action里加一行调试代码,比如
var errors = ModelState.Values.SelectMany(v => v.Errors);,然后通过断点查看具体的错误信息,就能快速定位问题。
- 比如模型里的
统一POST Action的路由配置
你的GET Action指定了自定义路由[Route("/admin/missions/create")],但POST Action没有配置对应的路由,这可能导致表单提交的地址和预期不符。给POST Action也加上相同的路由配置试试:[HttpPost] [Route("/admin/missions/create")] // 添加这行路由属性 public IActionResult CreateMission(Mission mission, IFormFile imageFile) { if (ModelState.IsValid) { db.Missions.Add(mission); db.SaveChanges(); return RedirectToAction("Admin", "Missions"); } return View(mission); }这样表单提交的地址就会和GET路由一致,避免路由匹配混乱。
确认表单的提交地址是否正确
打开浏览器开发者工具(按F12),查看页面中form标签的action属性值,确认它是不是/admin/missions/create。如果不是,检查视图里的asp-controller和asp-action有没有拼写错误(比如你视图里写的是asp-action="CreateMission",控制器里的Action名称是CreateMission,虽然ASP.NET路由默认不区分大小写,但保持一致更稳妥)。顺便提个小细节
你的视图里<input asp-for="@Model.Label"后面多写了一个</input>,input是自闭合标签,改成<input asp-for="@Model.Label" type="text" required class="form-control" />更规范,不过这个一般不会影响表单提交。
备注:内容来源于stack exchange,提问作者Emir Bolat

