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

ASP.NET MVC ActionLink删除行时无法传递RowID至控制器问题排查

解决ActionLink无法传递RowID并实现POST删除的问题

看起来你遇到的核心问题有两个:一是@Html.ActionLink默认生成的是GET请求,但你的删除逻辑写在POST方法里;二是参数名不匹配(ActionLink传的是id,控制器POST方法接收的是rowID),导致RowID无法正确传递到控制器。下面给你两种可行的解决方案:


方案一:用表单提交实现同步POST删除(最直接)

这种方式通过每行一个表单来触发POST请求,适合需要页面刷新的场景:

1. 修改视图代码

把原来的ActionLink替换成表单包裹的提交按钮:

<table id="LansingData" class="table">
<thead>
<tr>
<th>Action</th>
<th>Row ID</th>
</tr>
</thead>
<tbody>
@foreach (var item in Model.Records) {
<tr id="@item.RowIndex">
<td>
    @* 替换YourController为你实际的控制器名称,比如Lansing *@
    @using (Html.BeginForm("Delete", "YourController", new { rowID = item.RowIndex }, FormMethod.Post))
    {
        @* 如果启用防伪令牌,取消下面这行注释 *@
        @* @Html.AntiForgeryToken() *@
        <button type="submit" class="delete-button" onclick="return confirm('Are you sure you want to delete this user?');">Delete</button>
    }
</td>
<td>@item.RowIndex</td>
</tr>
}
</tbody>
</table>

2. 调整控制器代码

修改POST方法,让它直接对应Delete动作,确保参数名匹配:

// GET方法可保留(用于显示删除确认页)
public ActionResult Delete(int? rowID) {
    if (rowID == null) {
        return new HttpStatusCodeResult(HttpStatusCode.BadRequest);
    }
    LansingMileage lansing = db.LansingMileages.Find(rowID);
    if (lansing == null) {
        return HttpNotFound();
    }
    return View(lansing);
}

// 修改POST方法,直接绑定Delete动作
[HttpPost]
@* 如果启用防伪令牌,取消下面这行注释 *@
//[ValidateAntiForgeryToken]
public ActionResult Delete(int rowID) {
    LansingMileage lansing = db.LansingMileages.Find(rowID);
    if (lansing == null) {
        return HttpNotFound();
    }
    db.LansingMileages.Remove(lansing);
    db.SaveChanges();
    return RedirectToAction("Index");
}

点击删除按钮后,表单会提交POST请求到Delete动作,RowID会正确传递,执行删除后自动跳回Index页面。


方案二:用AJAX实现无刷新删除(保留ActionLink样式)

如果你想保留ActionLink的链接样式,同时实现无刷新删除,可以用JavaScript拦截点击事件:

添加data-rowid属性,并阻止默认的GET跳转:

<td>@Html.ActionLink("Delete", "Delete", new { }, new { onclick = "return false;", @class = "delete-button", data_rowid = item.RowIndex })</td>

2. 添加JavaScript处理逻辑

<script>
    // 给所有删除按钮绑定点击事件
    document.querySelectorAll('.delete-button').forEach(link => {
        link.addEventListener('click', function(e) {
            if (confirm('Are you sure you want to delete this user?')) {
                const rowID = this.dataset.rowid;
                // 发送POST请求
                fetch('@Url.Action("Delete", "YourController")', {
                    method: 'POST',
                    headers: {
                        'Content-Type': 'application/x-www-form-urlencoded',
                        @* 如果启用防伪令牌,添加请求头 *@
                        '@Html.AntiForgeryToken()'
                    },
                    body: `rowID=${rowID}`
                }).then(response => {
                    if (response.ok) {
                        // 删除成功后,直接移除当前行
                        document.getElementById(rowID).remove();
                    } else {
                        alert('删除失败,请重试');
                    }
                }).catch(error => {
                    console.error('请求出错:', error);
                    alert('请求出错,请重试');
                });
            }
        });
    });
</script>

3. 控制器代码

和方案一的POST方法保持一致即可,删除后页面不需要刷新,直接移除对应的行。


关键注意点

  • 参数名一致:视图传递的参数名必须和控制器方法的参数名完全匹配(都是rowID),不能出现id和rowID混用的情况。
  • 防伪令牌:如果启用[ValidateAntiForgeryToken],一定要在表单或AJAX请求中包含防伪令牌,否则会返回400错误。
  • 调试技巧:可以通过浏览器的开发者工具查看网络请求,确认请求方法是POST,参数是否正确传递。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.14 07:39:28