使用@Html.ActionLink实现数据库行删除失败,求技术排查
解决@Html.ActionLink实现删除功能失效的问题
我来帮你排查并修复这个删除功能的问题,先梳理下核心问题点,再给出具体的解决方案:
问题根源分析
你的删除功能失效主要有3个关键原因:
- 后台方法未执行SQL命令:你创建了SqlCommand对象,但既没有把传入的
id绑定到SQL参数,也没有调用ExecuteNonQuery()执行删除操作 - Razor Pages方法命名不规范:如果这是Razor Pages项目,你的
Delete方法不符合Handler命名规则(应该是OnGetDelete/OnPostDelete格式) - ActionLink路由参数不匹配:默认的ActionLink在Razor Pages中需要指定
handler参数,否则无法正确路由到处理方法
修复方案
1. 修正后台PageModel的删除方法
修改AboutModel.cshtml.cs中的代码,确保它是符合Razor Pages规范的Handler方法,并且正确执行删除逻辑:
public class AboutModel : PageModel // 确保继承PageModel,你的代码可能漏了这行 { [BindProperty] public int id { get; set; } public const string vv = "Data Source=Tables.sqlite3"; // 建议不要用静态连接,改用每次操作创建新连接,避免并发问题 private SqliteConnection GetConnection() => new SqliteConnection(vv); public struct CV { public string name; public int id; } // 改为Razor Pages的Get Handler方法,对应前端ActionLink的GET请求 public IActionResult OnGetDelete(int? id) { // 先校验ID有效性 if (id == null) { return BadRequest("无效的删除ID"); } using (var connection = GetConnection()) { connection.Open(); using (var cmd = connection.CreateCommand()) { cmd.CommandText = "Delete from MyTable1 where id = @id;"; // 参数化查询,防止SQL注入 cmd.Parameters.AddWithValue("@id", id.Value); // 执行删除命令 cmd.ExecuteNonQuery(); } } return RedirectToPage("About"); } }
2. 修正前端@Html.ActionLink的写法
在Razor Pages中,需要明确指定handler参数,让ActionLink正确路由到我们的OnGetDelete方法:
<body> @{ foreach( var cv in Model.GetCVs( username)) { <h3 style="color: #193367; "><b> Name: @cv.name</b></h3> <form action="" method="post"> <input type="submit" name="name" value="@cv.name" /> </form> <!-- 修正ActionLink,指定handler和page参数 --> @Html.ActionLink("Delete", "Delete", new { page = "/About", id = cv.id }) } } </body>
更规范的POST请求实现(推荐)
虽然你要求无需确认,但用GET请求执行删除存在CSRF风险,不符合REST规范,推荐改用POST请求实现:
前端修改为表单提交(样式模拟链接)
<body> @{ foreach( var cv in Model.GetCVs( username)) { <h3 style="color: #193367; "><b> Name: @cv.name</b></h3> <form action="" method="post"> <input type="submit" name="name" value="@cv.name" /> </form> <!-- 用表单实现POST删除,样式改成链接效果 --> <form asp-page-handler="Delete" method="post"> <input type="hidden" name="id" value="@cv.id" /> <button type="submit" style="border:none; background:none; color:blue; text-decoration:underline; cursor:pointer;"> Delete </button> </form> } } </body>
后台修改为POST Handler方法
// 改为POST Handler方法 public IActionResult OnPostDelete(int? id) { if (id == null) { return BadRequest("无效的删除ID"); } using (var connection = GetConnection()) { connection.Open(); using (var cmd = connection.CreateCommand()) { cmd.CommandText = "Delete from MyTable1 where id = @id;"; cmd.Parameters.AddWithValue("@id", id.Value); cmd.ExecuteNonQuery(); } } return RedirectToPage("About"); }
额外注意事项
- SQL注入防护:一定要用参数化查询(如
cmd.Parameters.AddWithValue),绝对不要直接拼接SQL字符串 - 数据库连接管理:避免使用静态连接对象,每次操作创建新连接并通过
using自动释放,能有效避免并发问题
内容的提问来源于stack exchange,提问作者Lilla
相关产品推荐
相关产品推荐

