点击Urgent按钮触发页面未找到错误,无法修改数据库状态的解决
问题原因分析
路由匹配错误:页面中硬编码URL
/Urgent/@item.Id,若你的控制器不是UrgentController(比如常用的HomeController),默认路由规则{controller}/{action}/{id}会将这个URL解析为请求UrgentController的Index方法,而非当前控制器的Urgent方法,直接导致“页面无法找到”。GET请求逻辑错误:当前控制器的
UrgentGET方法未执行切换Urgent字段的核心逻辑,仅查询数据后就返回Index视图,且传递的参数是id(int类型),但Index视图需要的是List<TodoTable>模型,模型类型不匹配会引发页面异常。POST方法未被触发:下拉菜单的a标签默认发起GET请求,完全不会进入POST类型的
Urgent方法,数据库修改逻辑根本没有执行的机会。
解决方法
方案一:使用GET请求完成状态切换(简单直接)
1. 修正页面URL生成方式
将Index.cshtml中的a标签href替换为Url.Action生成正确路由,避免硬编码:
<li><a class="dropdown-item" href="@Url.Action("Urgent", new { id = item.Id })">@(item.Urgent ? "Unurgent" : "Urgent")</a></li>
2. 修正控制器GET方法逻辑
修改Urgent GET方法,加入状态切换和数据库保存逻辑,最后重定向回Index页面刷新列表:
[HttpGet] public ActionResult Urgent(int id) { var task = db.TodoTables.SingleOrDefault(i => i.Id == id); if (task != null) // 增加空值判断,防止空引用异常 { task.Urgent = !task.Urgent; // 切换Urgent状态 db.SaveChanges(); // 保存修改到数据库 } return RedirectToAction("Index"); }
此时可以删除无用的POST类型Urgent方法。
方案二:使用POST请求完成状态切换(符合REST规范)
1. 替换a标签为表单提交
将Index.cshtml中的a标签替换为表单,发起POST请求:
<li> @using (Html.BeginForm("Urgent", "Home", new { id = item.Id }, FormMethod.Post)) { <button type="submit" class="dropdown-item btn btn-link p-0 text-start">@(item.Urgent ? "Unurgent" : "Urgent")</button> } </li>
注:"Home"替换为你的实际控制器名称;btn-link p-0 text-start是为了保持按钮样式和原a标签一致。
2. 修正控制器POST方法逻辑
修改POST方法,直接通过id查询数据并切换状态:
[HttpPost] public ActionResult Urgent(int id) { var task = db.TodoTables.SingleOrDefault(i => i.Id == id); if (task != null) { task.Urgent = !task.Urgent; db.SaveChanges(); } return RedirectToAction("Index"); }
额外优化点
- 避免使用C#关键字
Task作为变量名,改为小写task,符合命名规范。 - 始终增加空值判断(
SingleOrDefault可能返回null),防止空引用异常。
内容的提问来源于stack exchange,提问作者Emir Bolat
相关产品推荐
相关产品推荐

