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

ASP.NET WebForms中模态对话框无法弹出的JavaScript执行问题

ASP.NET WebForms中模态对话框无法弹出的JavaScript执行问题

我在使用基于ASPX页面的ASP.NET WebForms应用,需求是这样的:当用户修改费率名称并点击保存按钮后,要弹出一个模态对话框,要求输入必填的工单编号和可选的备注。

在编辑费率名称时会触发文本变更事件,由于显示费率的GridView是动态生成的,我用了一个隐藏TextBox来捕获变更,把修改后的名称存入字典再放到Session里,后台代码如下:

Protected Sub TariffNameChangesTextbox_OnTextChanged(sender As Object, e As EventArgs) Handles TariffNameChangesTextbox.TextChanged
    Dim txtBox As TextBox = TryCast(sender, TextBox)
    If txtBox IsNot Nothing Then

        Dim textboxNr As Integer = DirectCast(txtBox.DataItemContainer, System.Web.UI.WebControls.GridViewRow).RowIndex
        Dim textboxId As String = txtBox.ID
        Dim keyForDict As String = $"{textboxId}_{textboxNr.ToString().PadLeft(3, "0"c)}"

        Dim dictionaryChangedTariffNames As Dictionary(Of String, String) = TryCast(Session("ChangedTariffNames"), Dictionary(Of String, String))
        If dictionaryChangedTariffNames Is Nothing Then
            dictionaryChangedTariffNames = New Dictionary(Of String, String)()
            dictionaryChangedTariffNames.Add(keyForDict, txtBox.Text)
        ElseIf dictionaryChangedTariffNames.Count > 0 AndAlso dictionaryChangedTariffNames.ContainsKey(keyForDict) Then
            dictionaryChangedTariffNames(keyForDict) = txtBox.Text
        Else
            dictionaryChangedTariffNames.Add(keyForDict, txtBox.Text)
        End If

        Session("ChangedTariffNames") = dictionaryChangedTariffNames
    End If
End Sub

现在遇到的问题是:保存按钮是全局的,没法修改,但它会调用母版页(MasterPage.master.vb)里的一个方法,这个方法只针对当前页面执行保存逻辑。我尝试从Session取出字典后,注册启动脚本来触发模态对话框,但脚本就是不执行,模态框弹不出来。脚本文件的路径是正确的,已经在项目目录里了。

编辑:
补充一下细节:VB.NET代码位于MasterPage.master中,但需要弹出对话框的目标页面是tarifnamen.aspx。脚本已经成功加载到HTML里了——我在控制台执行typeof handleSaveButtonClick,返回的是function,说明脚本确实存在,但注册的启动脚本就是不执行,模态框死活弹不出来。

母版页里注册脚本的代码是这样的:

Dim dictionaryChangedTariffNames As Dictionary(Of String, String) = TryCast(Session("ChangedTariffNames"), Dictionary(Of String, String))
If dictionaryChangedTariffNames IsNot Nothing AndAlso dictionaryChangedTariffNames.Count > 0 Then
    Dim cs As ClientScriptManager = Page.ClientScript
    If Not cs.IsStartupScriptRegistered(Me.GetType(), "ModalDialogForTariffRename") Then
        'Page.ClientScript.RegisterStartupScript(Me.GetType(), "ModalDialogForTariffRename", "handleSaveButtonClick();", True)
        Page.ClientScript.RegisterStartupScript(Me.GetType(), "ModalDialogForTariffRename", "$(""Content1"").handleSaveButtonClick();", True)
    End If
    dictionaryChangedTariffNames.Clear()
End If
Session("ChangedTariffNames") = dictionaryChangedTariffNames

我已经在主页面的head标签里引用了对应的CSS和JS文件:

<link rel="stylesheet" type="text/css" href="css/ModalDialogForTariffRename.css" />
<script type="text/javascript" src="js/ModalDialogForTariffRename.js"></script>

在tarifnamen.aspx页面中,我写了模态对话框的HTML结构:

<!-- Modal Dialog für Tarifumbenennung -->
 <div id="tariffRenameModal" class="tariff-name-modaldialog">
    <div class="tariff-name-modaldialog-content">
    <span class="modaldialog-close-btn">&times;</span>
    <h2>Tarif umbenennen – Bitte Ticketnummer und Kommentar angeben</h2>
    
    <label for="ticketNumber">Ticketnummer (Pflichtfeld):</label>
    <input type="text" id="ticketNumber" name="ticketNumber" required />
    <br />

    <label for="comment">Kommentar (optional):</label>
    <textarea id="comment" name="comment" rows="4" cols="50"></textarea>
    <br />

    <button id="saveTicketButton" onclick="saveTariffRenameTicket()">Speichern</button>
    <button onclick="closeTariffRenameModal()">Abbrechen</button>
</div>

对应的CSS文件(ModalDialogForTariffRename.css)内容:

/* Tarifumbenennung Modaldialog */
.tariff-name-modaldialog {
    display: none;
    position: fixed;
    z-index: 1;
    left: 0;
    top: 0;
    width: 100%;
    height: 100%;
    background-color: rgba(0, 0, 0, 0.4);
    overflow: auto;
}

/* Modaldialog-Inhalt */
.tariff-name-modaldialog-content {
    background-color: #fff;
    margin: 15% auto;
    padding: 20px;
    border: 1px solid #888;
    width: 60%;
    max-width: 500px;
}

.modaldialog-close-btn {
    color: #aaa;
    float: right;
    font-size: 28px;
    font-weight: bold;
}

    .modaldialog-close-btn:hover,
    .modaldialog-close-btn:focus {
        color: black;
        text-decoration: none;
        cursor: pointer;
    }

.tariff-name-modaldialog input[type="text"],
.tariff-name-modaldialog textarea {
    width: 100%;
    padding: 10px;
    margin: 5px 0;
    border: 1px solid #ccc;
    border-radius: 5px;
}

.tariff-name-modaldialog textarea {
    resize: vertical;
    min-height: 100px;
}


.tariff-name-modaldialog button {
    background-color: #4CAF50; /* green for saving */
    color: white;
    padding: 10px 20px;
    margin-top: 10px;
    border: none;
    cursor: pointer;
    border-radius: 5px;
}

    .tariff-name-modaldialog button:hover {
        background-color: #45a049; /* darker green when hovering */
    }

    /* Abbrechen-Button */
    .tariff-name-modaldialog button:last-child {
        background-color: #f44336; /* red for cancel */
    }

        .tariff-name-modaldialog button:last-child:hover {
            background-color: #e53935; /* darker red when hovering */
        }

JS文件(ModalDialogForTariffRename.js)内容:

function handleSaveButtonClick()
{
    if (window.location.pathname.includes("tarifnamen.aspx")) {
        openModal();
    }
    else
    {
        console.log("Button wird auf einer anderen Seite aufgerufen, Modaldialog wird nicht geöffnet.");
    }
}

function openModal() {
    var modal = document.getElementById('myModal');
    modal.style.display = 'block';
}

function showModal()
{
    var modal = document.getElementById("myModal");
    modal.style.display = "block";
}

function closeModal()
{
    var modal = document.getElementById("myModal");
    modal.style.display = "none";
}

function saveChanges()
{
    var ticketNumber = document.getElementById("ticketNumber").value;
    var comment = document.getElementById("comment").value;

    if (!ticketNumber)
    {
        alert("Bitte geben Sie eine Ticketnummer ein.");
        return false; // avoids sending when no ticket number is present
    }

    /*alert("Änderungen wurden gespeichert!");*/
    closeModal();
    return true;
}

备注:内容来源于stack exchange,提问作者Daniel

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.04.14 11:58:01