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

ASP.Net WebForms中toastr通知进程控制关闭及tapToDismiss失效问题

解决ASP.Net WebForms中Toastr通知的两个问题:tapToDismiss不生效与手动控制关闭

一、修复tapToDismiss参数不生效的问题

你的原代码错误地将tapToDismiss作为第三个参数直接传入toastr方法,而toastr的正确调用格式是:toastr[type](message, title, options),其中第三个参数是配置对象,所有选项(包括tapToDismiss)都需要放在这个对象里。

修改后的后端方法如下:

private void ShowToastr(Page page, string message, string title, string type = "info", bool tapToDismiss = false, bool disableAutoClose = false)
{
    // 使用JavaScriptSerializer序列化配置对象,避免字符串转义问题
    var serializer = new System.Web.Script.Serialization.JavaScriptSerializer();
    var options = new
    {
        tapToDismiss = tapToDismiss,
        timeOut = disableAutoClose ? 0 : 5000, // 0表示禁用自动关闭
        closeButton = !disableAutoClose, // 禁用自动关闭时隐藏关闭按钮
        extendedTimeOut = 0
    };
    var optionsJson = serializer.Serialize(options);

    var script = $"toastr.{type.ToLower()}('{EscapeSingleQuotes(message)}', '{EscapeSingleQuotes(title)}', {optionsJson});";
    page.ClientScript.RegisterStartupScript(page.GetType(), $"toastr_{Guid.NewGuid()}", script, addScriptTags: true);
}

// 辅助方法:转义字符串中的单引号,避免JavaScript语法错误
private string EscapeSingleQuotes(string input)
{
    return input?.Replace("'", "\\'") ?? string.Empty;
}

关键修改点:

  • 用配置对象传递tapToDismiss等选项,而非直接传布尔值
  • 添加disableAutoClose参数,用于控制是否自动关闭通知
  • 新增字符串转义方法,避免message/title中的单引号导致JS语法错误
  • 用Guid.NewGuid()生成唯一的脚本键,避免多次调用时脚本被覆盖

二、实现进程运行时阻止关闭,进程结束后手动关闭

要实现“进程运行时通知无法关闭,结束后自动关闭”的效果,需要分两步操作:

1. 启动进程时显示不可关闭的通知

调用修改后的ShowToastr方法,设置disableAutoClose: true和tapToDismiss: false,这样通知既不会自动关闭,也无法通过点击或关闭按钮关闭:

// 启动后台进程前调用
ShowToastr(this.Page, "正在处理,请稍候...", "操作中", type: "info", tapToDismiss: false, disableAutoClose: true);

2. 进程结束后关闭通知

当后台进程完成后,通过后端注册脚本调用toastr的关闭方法,或者前端监听进程完成事件后执行关闭逻辑:

方式一:后端注册关闭脚本(适合同步操作或进程完成后回发页面的场景)

// 进程结束后调用
var closeScript = "toastr.clear();"; // 关闭所有toastr通知
// 或者关闭特定通知:如果需要跟踪单个通知实例,可在显示时保存实例,这里简化为关闭所有
Page.ClientScript.RegisterStartupScript(this.GetType(), $"toastr_close_{Guid.NewGuid()}", closeScript, addScriptTags: true);

方式二:前端AJAX监听进程状态(适合异步后台进程)

如果你的进程是异步执行的(比如通过AJAX轮询或SignalR推送状态),可以在前端收到进程完成的信号后执行关闭:

// 示例:AJAX轮询进程状态
function checkProcessStatus() {
    $.ajax({
        url: "CheckProcessStatus.aspx",
        type: "GET",
        success: function(response) {
            if (response.isCompleted) {
                toastr.clear(); // 关闭通知
                // 可选:显示操作完成的成功通知
                toastr.success("操作完成!", "成功");
            } else {
                setTimeout(checkProcessStatus, 1000); // 1秒后再次查询
            }
        }
    });
}

// 页面加载时启动轮询(如果是异步场景)
$(function() {
    checkProcessStatus();
});

额外注意事项

  • 确保已正确引入toastr的CSS和JS文件到页面中
  • 如果需要更精细地控制单个通知,可在显示时保存通知实例:var toastInstance = toastr.info('消息', '标题', options);,后续通过toastr.clear(toastInstance)关闭特定实例

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.19 04:35:32