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

Razor页面OnPostDeleteAsync方法未执行问题求助

无法触发OnPostDeleteAsync的问题排查与修复

核心问题分析

  1. 参数名冲突:页面OnGetAsync的路由参数是id(绑定到CrmClientId),而OnPostDeleteAsync的参数也叫id,导致POST请求时模型绑定混乱,无法正确获取Survey的ID。
  2. 请求URL不完整:Fetch请求的URL未保留页面原有的CrmClientId参数,路径写法冗余,可能导致路由匹配失败。
  3. 缺少错误捕获:Fetch请求未添加错误处理,即使请求失败也无法在控制台看到报错信息,难以排查问题。

修复步骤

1. 修改后端参数名,避免冲突

打开/Surveys/Index.cshtml.cs,将OnPostDeleteAsync的参数名改为surveyId,并同步修改方法内的引用:

public async Task<IActionResult> OnPostDeleteAsync(Guid surveyId)
{
    Console.WriteLine("Entered OnPostDeleteAsync");

    var survey = await _context.CrmSurveys.FindAsync(surveyId);

    if (survey != null)
    {
        bool isUsed = await _context.CrmLineItems.AnyAsync(li => li.CuSurveyId == survey.CuSurveyId);
        if (!isUsed)
        {
            _context.CrmSurveys.Remove(survey);
            await _context.SaveChangesAsync();
        }
        else
        {
            return new JsonResult(new { success = false, message = "Survey is in use and cannot be deleted." });
        }
    }

    return new JsonResult(new { success = true });
}

2. 修正前端Fetch请求的URL与错误处理

打开/Surveys/Index.cshtml,修改Script部分的Fetch代码:

document.addEventListener('DOMContentLoaded', function () {
    const token = document.querySelector('input[name="__RequestVerificationToken"]').value;
    const deleteLinks = document.querySelectorAll('.delete-survey');
    const crmClientId = '@Model.CrmClientId';

    deleteLinks.forEach(link => {
        link.addEventListener('click', function (e) {
            e.preventDefault();
            const surveyId = this.getAttribute('data-id');
            Swal.fire({
                title: 'Are you sure?',
                text: "You won't be able to revert this!",
                icon: 'warning',
                showCancelButton: true,
                confirmButtonText: 'Yes, delete it!',
                cancelButtonText: 'Cancel'
            }).then((result) => {
                if (result.isConfirmed) {
                    fetch(`?id=${crmClientId}&handler=Delete&surveyId=${surveyId}`, {
                        method: 'POST',
                        headers: {
                            'RequestVerificationToken': token,
                            'Content-Type': 'application/x-www-form-urlencoded'
                        }
                    })
                    .then(response => {
                        if (!response.ok) {
                            throw new Error(`HTTP error! status: ${response.status}`);
                        }
                        return response.json();
                    })
                    .then(data => {
                        if (data.success) {
                            Swal.fire(
                                'Deleted!',
                                'The survey has been deleted.',
                                'success'
                            );
                            this.closest('tr').remove();
                        } else {
                            Swal.fire(
                                'Error!',
                                data.message,
                                'error'
                            );
                        }
                    })
                    .catch(err => {
                        console.error('Delete request failed:', err);
                        Swal.fire(
                            'Error!',
                            'Failed to delete survey.',
                            'error'
                        );
                    });
                }
            });
        });
    });
});

3. 验证关键细节

  • 确认data-id="@Model.Surveys[i].Id"绑定的是Survey实体的主键ID(Guid类型),而非其他字段。
  • 确保@Html.AntiForgeryToken()已正确生成在页面中,避免CSRF验证失败。

额外说明

修复后,点击Delete链接并确认后,请求会正确触发OnPostDeleteAsync方法,断点可以命中,同时错误处理会在控制台输出异常信息,方便后续排查其他问题。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.12 22:07:01