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

如何在Kendo Grid中带确认删除行并传递选中ID至Destroy方法

我来帮你解决这个问题,你的核心问题出在Destroy动作的参数传递方式和缺少删除确认提示这两点上,咱们一步步来修正:

1. 错误原因分析

你在配置Destroy动作时写了 .Destroy(update => update.Action("Delete", "Home", Model.ID)),这里的Model.ID是页面全局ViewModel的ID,并不是当前要删除的行的ID,所以运行时会提示为空。Kendo Grid的Ajax数据源在执行Destroy操作时,会自动把当前选中行的模型数据(包括ID)提交到后台接口,完全不需要手动在Action路径里传参数。

2. 添加删除确认提示

给Destroy按钮添加自定义样式类,然后通过jQuery绑定点击事件实现确认弹窗:

  • 修改Grid列的Command配置:
columns.Command(command => command.Destroy().Text("Delete").HtmlAttributes(new { @class = "delete-confirm" })).Width(110);
  • 在页面底部添加JavaScript代码:
$(document).ready(function() {
    // 绑定删除确认事件
    $(document).on("click", ".delete-confirm", function(e) {
        if (!confirm("确定要删除这条邮件模板吗?")) {
            e.preventDefault(); // 用户取消时阻止删除动作
        }
    });
});

3. 修正Destroy数据源配置

把原来带Model.ID的Destroy配置改成不带参数的形式,让Kendo自动传递当前行ID:

.Destroy(update => update.Action("Delete", "Home"))

4. 调整控制器方法(优化UI刷新)

你的现有Delete方法逻辑没问题,但需要返回Json格式的响应,这样Kendo Grid才能正确刷新界面:

[HttpPost]
public ActionResult Delete([DataSourceRequest] DataSourceRequest request, int ID)
{
    Worker.DeleteEmailTemplate(ID);
    // 返回空的数据源结果,告诉Grid删除成功
    return Json(ModelState.ToDataSourceResult());
}

如果需要更严谨的返回,也可以返回被删除的模型数据:

[HttpPost]
public ActionResult Delete([DataSourceRequest] DataSourceRequest request, int ID)
{
    Worker.DeleteEmailTemplate(ID);
    return Json(new[] { new EmailTemplate { ID = ID } }.ToDataSourceResult(request, ModelState));
}

完整修改后的CSHTML代码

@(Html.Kendo().Grid<EmailTemplateEditor.Models.EmailTemplate>()
    .Name("EmailTemplates")
    .Columns(columns => {
        columns.Bound(c => c.ID).ClientTemplate("<a href='/EmailTemplate/EmailTemplate/#=ID#'>#=ID#</a>");
        columns.Bound(c => c.Name);
        columns.Bound(c => c.Subject);
        columns.Bound(c => c.OperationalBrand);
        columns.Bound(c => c.Body);
        columns.Bound(c => c.DateAdded).Format("{0:MM/dd/yyyy}");
        columns.Command(command => command.Destroy().Text("Delete").HtmlAttributes(new { @class = "delete-confirm" })).Width(110);
    })
    .HtmlAttributes(new { style = "height: 700px;" })
    .Scrollable()
    .Groupable()
    .AutoBind(true)
    .Sortable()
    .Filterable()
    .Pageable(pageable => pageable
        .PageSizes(true)
        .ButtonCount(5))
    .DataSource(dataSource => dataSource
        .Ajax()
        .Model(model => model.Id(p => p.ID))
        .Read(read => read.Action("GetEmailTemplates", "Home"))
        .PageSize(20)
        .ServerOperation(true)
        .Destroy(update => update.Action("Delete", "Home"))
    )
)

<script>
$(document).ready(function() {
    $(document).on("click", ".delete-confirm", function(e) {
        if (!confirm("确定要删除这条邮件模板吗?")) {
            e.preventDefault();
        }
    });
});
</script>

关于Transport风格的补充(非必须)

如果你后续确实需要自定义参数传递逻辑,才需要重构为Transport风格,示例如下,但上面的方案已经完全满足你的需求,不需要额外重构:

.DataSource(dataSource => dataSource
    .Ajax()
    .Model(model => model.Id(p => p.ID))
    .Read(read => read.Action("GetEmailTemplates", "Home"))
    .PageSize(20)
    .ServerOperation(true)
    .Transport(transport => {
        transport.Destroy(destroy => {
            destroy.Action("Delete", "Home");
            destroy.Type(HttpVerbs.Post);
        });
        transport.ParameterMap((data, type) => {
            if (type == "destroy") {
                return { ID: data.models[0].ID };
            }
            return data;
        });
    })
)

内容的提问来源于stack exchange,提问作者Dylan West

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.29 08:06:03