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

使用@Html.ActionLink实现数据库行删除失败,求技术排查

解决@Html.ActionLink实现删除功能失效的问题

我来帮你排查并修复这个删除功能的问题,先梳理下核心问题点,再给出具体的解决方案:

问题根源分析

你的删除功能失效主要有3个关键原因:

  1. 后台方法未执行SQL命令:你创建了SqlCommand对象,但既没有把传入的id绑定到SQL参数,也没有调用ExecuteNonQuery()执行删除操作
  2. Razor Pages方法命名不规范:如果这是Razor Pages项目,你的Delete方法不符合Handler命名规则(应该是OnGetDelete/OnPostDelete格式)
  3. 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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.07 19:32:43