ASPX webform Bootstrap吐司自动隐藏在updatepanel中不工作

kadbb459  于 5个月前  发布在  .NET
关注(0)|答案(1)|浏览(50)

我使用Bootstrap吐司来显示警报消息,但我遇到的问题是自动隐藏它们。
我尝试了使用和不使用data-bs-autohide="true" data-bs-delay="3000",但没有成功。
棘手的部分是我在代码后面创建这个吐司,并将其附加到aspx页面控件。
我尝试了HTML中的静态代码,但它仍然不起作用。
我相信这是由于asp:UpdatePanel
这是我的代码。

如何让它自动隐藏?
页面.aspx

<asp:Content ID="Content1" ContentPlaceHolderID="MainContent" runat="server">
    <div class="container body-content pt-3 mb-3">

        <asp:UpdatePanel ID="UpdatePanel4" runat="server" UpdateMode="Conditional">
            <ContentTemplate>
                <div class="col-md-12">
                    <div runat="server" id="alertParent" class="toast-container position-fixed top-0 end-0 p-3">
                    </div>
 <asp:Button ID="Button1" CssClass="btn btn-primary" CausesValidation="false" OnClick="Button1_Click" runat="server" Text="Show" />
                </div>
            </ContentTemplate>
        </asp:UpdatePanel>
    </div>
</asp:Content>

字符串

page.aspx.cs

protected void ShowAlertMessage(string tstr, string Header = "")
{
    try
    {
        //Header = string.IsNullOrEmpty(Header) ? "Error" : Header;

        alertParent.Visible = true;
        alertParent.Style.Add("z-index", "3");

        var div = new HtmlGenericControl("div");                
        div.Attributes["role"] = "alert";
        div.Attributes["aria-live"] = "assertive";
        div.Attributes["aria-atomic"] = "true";
        div.Attributes["data-bs-autohide"] = "true";
        div.Attributes["data-bs-delay"] = "3000";

        var Child_div = new HtmlGenericControl("div");
        Child_div.Attributes["class"] = "toast-header";

        var Sub_Child_1 = new HtmlGenericControl("strong");
        Sub_Child_1.Attributes["class"] = "me-auto";
        Sub_Child_1.InnerHtml = Header;

        var Sub_Child_2 = new HtmlGenericControl("span");
        //Sub_Child_2.Attributes["type"] = "button";
        Sub_Child_2.Attributes["class"] = "btn-close";
        Sub_Child_2.Attributes["data-bs-dismiss"] = "toast";
        Sub_Child_2.Attributes["aria-label"] = "Close";

        Child_div.Controls.Add(Sub_Child_1);
        Child_div.Controls.Add(Sub_Child_2);

        var Child_div_2 = new HtmlGenericControl("div");
        Child_div_2.Attributes["class"] = "toast-body";

        div.Controls.Add(Child_div);
        div.Controls.Add(Child_div_2);

        string sFlag, smessage;
        if (tstr.Length == 0)
            return;

        string[] words = tstr.Split('_');
        sFlag = words[0];
        smessage = words[1];
        switch (sFlag)
        {
            case "warning":
                {
                    div.Attributes["class"] = "toast fade  text-bg-warning";
                    Child_div_2.InnerHtml = smessage;
                    break;
                }

            case "danger":
                {// REM error
                    div.Attributes["class"] = "toast fade text-bg-danger";
                    Child_div_2.InnerHtml = smessage;
                    break;
                }

            case "success":
                {// REM error
                    div.Attributes["class"] = "toast fade text-bg-success";
                    Child_div_2.InnerHtml = smessage;
                    break;
                }

            case "primary":
                {// REM error
                    div.Attributes["class"] = "toast fade text-bg-primary";
                    Child_div_2.InnerHtml = smessage;
                    break;
                }

            case "info":
                {// REM error
                    div.Attributes["class"] = "toast fade text-bg-info";
                    Child_div_2.InnerHtml = smessage;
                    break;
                }

            default:
                {
                    div.Attributes["class"] = "toast fade hide text-bg-info";
                    Child_div_2.InnerHtml = "";
                    alertParent.Visible = false;
                    alertParent.Style.Add("z-index", "-1");
                    break;
                }
        }
        alertParent.Controls.Add(div);
    }
    catch (Exception ex)
    {
        Console.WriteLine(ex.Message);
    }
}

protected void Button1_Click(object sender, EventArgs e)
{
    ShowAlertMessage("success_My Message is here.");
}

3hvapo4f

3hvapo4f1#

Bootstrap Toast必须先初始化

正如Bootstrap 5文档中所指出的,“由于性能原因,Toast是可选的,因此您必须自己初始化它们。”
要从后面的ASPX C#代码初始化新的吐司,我们可以添加一个ID并使用ScriptManager调用Bootstrap方法。我们需要初始化吐司并显示它以使自动隐藏工作。

C#代码

div.ID = "toast-1";
var script = $"bootstrap.Toast.getOrCreateInstance(document.getElementById('{div.ID}')).show();";
ScriptManager.RegisterStartupScript(this.Page, Page.GetType(), "text", script, true);

字符串

完整演示

该演示已在Visual Studio中进行了测试。单击按钮将创建一个与原始组件相同的新吐司组件。但是,它随后使用ScriptManager初始化并显示吐司。吐司显示3秒,然后自动隐藏。

// C# code Page.aspx.cs 

using System;
using System.Web.UI;
using System.Web.UI.HtmlControls;

public partial class Page : System.Web.UI.Page
{
    protected void ShowAlertMessage(string tstr, string Header = "")
    {
        try
        {
            alertParent.Visible = true;
            alertParent.Style.Add("z-index", "3");

            var div = new HtmlGenericControl("div");
            div.Attributes["role"] = "alert";
            div.Attributes["aria-live"] = "assertive";
            div.Attributes["aria-atomic"] = "true";
            div.Attributes["data-bs-autohide"] = "true";
            div.Attributes["data-bs-delay"] = "3000";

            var Child_div = new HtmlGenericControl("div");
            Child_div.Attributes["class"] = "toast-header";

            var Sub_Child_1 = new HtmlGenericControl("strong");
            Sub_Child_1.Attributes["class"] = "me-auto";
            Sub_Child_1.InnerHtml = Header;

            var Sub_Child_2 = new HtmlGenericControl("span");
            //Sub_Child_2.Attributes["type"] = "button";
            Sub_Child_2.Attributes["class"] = "btn-close";
            Sub_Child_2.Attributes["data-bs-dismiss"] = "toast";
            Sub_Child_2.Attributes["aria-label"] = "Close";

            Child_div.Controls.Add(Sub_Child_1);
            Child_div.Controls.Add(Sub_Child_2);

            var Child_div_2 = new HtmlGenericControl("div");
            Child_div_2.Attributes["class"] = "toast-body";

            div.Controls.Add(Child_div);
            div.Controls.Add(Child_div_2);

            string sFlag, smessage;
            if (tstr.Length == 0)
                return;

            string[] words = tstr.Split('_');
            sFlag = words[0];
            smessage = words[1];
            switch (sFlag)
            {
                case "warning":
                    {
                        div.Attributes["class"] = "toast fade text-bg-warning";
                        Child_div_2.InnerHtml = smessage;
                        break;
                    }

                case "danger":
                    {// REM error
                        div.Attributes["class"] = "toast fade text-bg-danger";
                        Child_div_2.InnerHtml = smessage;
                        break;
                    }

                case "success":
                    {// REM error
                        div.Attributes["class"] = "toast fade text-bg-success";
                        Child_div_2.InnerHtml = smessage;
                        break;
                    }

                case "primary":
                    {// REM error
                        div.Attributes["class"] = "toast fade text-bg-primary";
                        Child_div_2.InnerHtml = smessage;
                        break;
                    }

                case "info":
                    {// REM error
                        div.Attributes["class"] = "toast fade text-bg-info";
                        Child_div_2.InnerHtml = smessage;
                        break;
                    }

                default:
                    {
                        div.Attributes["class"] = "toast fade hide text-bg-info";
                        Child_div_2.InnerHtml = "";
                        alertParent.Visible = false;
                        alertParent.Style.Add("z-index", "-1");
                        break;
                    }
            }
            alertParent.Controls.Add(div);

            // NEW CODE 
            div.ID = "toast-1";
            var script = $"bootstrap.Toast.getOrCreateInstance(document.getElementById('{div.ID}')).show();";
            ScriptManager.RegisterStartupScript(this.Page, Page.GetType(), "text", script, true);

        }
        catch (Exception ex)
        {
            Console.WriteLine(ex.Message);
        }
    }

    protected void Button1_Click(object sender, EventArgs e)
    {
        ShowAlertMessage("success_My Message is here.");
    }
}
<!-- Page.aspx -->
<%@ Page Language="C#" AutoEventWireup="true" CodeFile="Page.aspx.cs" Inherits="Page" %>

<!DOCTYPE html>
<html xmlns="http://www.w3.org/1999/xhtml" lang="en">
<head runat="server">
    <meta charset="utf-8" />
    <meta name="viewport" content="width=device-width, initial-scale=1" />
    <title>Demo</title>
    <link rel="stylesheet" href="https://cdn.jsdelivr.net/npm/[email protected]/dist/css/bootstrap.min.css" />
</head>
<body>
    <form id="aspNet" runat="server">
        <asp:ScriptManager ID="ScriptManager1" runat="server"></asp:ScriptManager>
        <div class="container body-content pt-3 mb-3">
            <asp:UpdatePanel ID="UpdatePanel4" runat="server" UpdateMode="Conditional">
                <ContentTemplate>
                    <div class="col-md-12">
                        <div runat="server" id="alertParent" class="toast-container position-fixed top-0 end-0 p-3">
                        </div>
                        <asp:Button ID="Button1" CssClass="btn btn-primary" CausesValidation="false" OnClick="Button1_Click" runat="server" Text="Show" />
                    </div>
                </ContentTemplate>
            </asp:UpdatePanel>
        </div>
    </form>
    <script src="https://cdn.jsdelivr.net/npm/[email protected]/dist/js/bootstrap.bundle.min.js"></script>
</body>
</html>

的数据

相关问题