Asp.net ClientIdMode = "static" 的 Web 表单用户控件无法在 javascript 中访问

Asp.net web form user control with ClientIdMode = "static" cannot be accessed in javascript

我有一个在 ASP.Net 网页表单页面中使用的用户控件。在用户控件中,我设置了 ClientIdMode = "static" 例如

<%@ Control Language="C#" AutoEventWireup="true"
CodeBehind="QuestionUserControl.ascx.cs"
Inherits="Kids.Math.Presentation.UserControls.QuestionUserControl"     ClientIDMode="Static" %>

在我使用的表单中,我还将 Id 设置为:

 <uc2:QuestionUserControl runat="server" ID="QuestionUserControl1" ClientIDMode="Static" />

但是,当 运行 我试图通过 getElementById("QuestionUserControl1") 或使用 JQuery $("# QuestionUserControl1") ... 它不起作用。实际上,用户控件似乎没有出现在源代码中......当检查源代码时我找不到 "QuestionUserControl1" 但是我可以找到其中的控件,例如 ctl00$MainContent$QuestionUserControl1$txtQuestion ...

不确定为什么没有显示用户控件 ID?

如有任何意见,我们将不胜感激...

更新:用户控件标记(请原谅内联标记样式,因为它只是一个测试版本...)

    <%@ Control Language="C#" AutoEventWireup="true"
    CodeBehind="QuestionUserControl.ascx.cs"
    Inherits="Kids.Math.Presentation.UserControls.QuestionUserControl" ClientIDMode="Static" %>

<style type="text/css">
    .auto-style1 {
        width: 100%;
    }
</style>

<div runat="server" style="Width:100%; Height:100%;" class="panel-body panel-question" ClientIDMode="Static" id="pnlQuestion">

    <div runat="server" style="Width:100%; Height:100%;" ClientIDMode="Static" ID="pnlTextbox">
        <asp:TextBox ID="lblTimer" runat="server" BackColor="Black" BorderColor="Black" BorderStyle="None" BorderWidth="0px" ClientIDMode="Static" ForeColor="White" Visible="False" Width="100%" Font-Bold="True" Font-Size="Large" ReadOnly="True"></asp:TextBox>
        <asp:TextBox CssClass="textarea" TextMode="MultiLine"
            Height="100%" ID="txtQuestion" runat="server"
            BackColor="Black" ReadOnly="True" Width="100%"
            Font-Size="X-Large" ForeColor="White"></asp:TextBox>
    </div>
    <div style="Width:100%; Height:30%;">

        <table class="auto-style1">
            <tr>
                <td>
                    <asp:Button ID="Answer1" runat="server" BorderStyle="Dashed"
                        CommandName="Answer1" Width="100%" OnCommand="Question_Answered" Enabled="False" BackColor="Black" Font-Size="X-Large" ForeColor="White" />
                </td>
                <td>
                    <asp:Button ID="Answer2" runat="server" BorderStyle="Dashed"
                        CommandName="Answer2" Width="100%" OnCommand="Question_Answered" Enabled="False" BackColor="Black" Font-Size="X-Large" ForeColor="White" />
                </td>
                <td>
                    <asp:Button ID="Answer3" runat="server" BorderStyle="Dashed"
                        CommandName="Answer3" Width="100%" OnCommand="Question_Answered" Enabled="False" BackColor="Black" Font-Size="X-Large" ForeColor="White" />`enter code here`
                </td>
            </tr>
        </table>

    </div>

    <asp:HiddenField ID="HiddenField1" runat="server" />
</div>

ctl00$MainContent$QuestionUserControl1$txtQuestion 来自具有 ID txtQuestion 或类似内容的 asp 标签。

这不是答案,因为在问题中分享了糟糕的标记我建议这样做:

包装你的用户控件

<%@ Control Language="C#" AutoEventWireup="true"
CodeBehind="QuestionUserControl.ascx.cs"
Inherits="Kids.Math.Presentation.UserControls.QuestionUserControl"%>
<asp:Placeholder id="uniqueID" runat="server" ClientIDMode="static">
<!-- your asp tags inside user control -->
</asp:Placeholder>

现在检查你的 html,如果你找到一个 div with id="uniqueID" -> 那是你的第一个由用户控件创建的标签。

我终于想到了这个词: - 向用户控件添加了一个新按钮,称为错误答案 - 在 javascript 倒计时结束后 - 我为这个新按钮做了一个回发,即 __doPostBack("InCorrectAnswer", "");

然后在用户控件中,我决定在单击 InCorrectAnswer 时要执行的操作...这基本上意味着完成该过程。

这对我来说很好。