【问题标题】:Custom Web Control ID includes child ID自定义 Web 控件 ID 包括子 ID
【发布时间】:2020-02-21 23:40:45
【问题描述】:

我的自定义 Web 控件 (ascx)

<%@ Control Language="C#" AutoEventWireup="true" CodeFile="CustomAutoCompleteTextBox.ascx.cs" Inherits="UserControls_CustomAutoCompleteTextBox" ClientIDMode="Static" %>

<asp:TextBox ID="AutoCompleteTextBox" runat="server" />

网页EquipmentMove上的实现

<%@ Page Language="C#" MasterPageFile="~/SiteMasterPage.master" AutoEventWireup="true" CodeFile="EquipmentMove.aspx.cs" Inherits="Equipment_EquipmentMove" %>

 <Custom:AutoCompleteTextBox runat="server" ID="HardwareSNTextBox1"
            OnCloseFunction="TestOnClosefunction"
            OnFocusFunction="testme"
            OnKeyUpFunction="EquipmentSearchCheckHardwareSNLength"
            PostbackURL="EquipmentMove.aspx/HardwareSNAutoComplete"
            SpellCheck="false" />

在运行时,Custom:AutoCompleteTextBox 控件的客户端 ID 变为“HardwareSNTextBox1_AutoCompleteTextBox”。结果标记:

<input name="ctl00$cpBody$HardwareSNTextBox1$AutoCompleteTextBox" type="text" id="ctl00_cpBody_HardwareSNTextBox1_AutoCompleteTextBox" class="ui-autocomplete-input" autocomplete="off">

如果我想在 EquipmentMove 网页上上编写一个名为“TestOnClosefunction”的 javascript,并且我想访问此控件,但使用它最初输入的 ID 为“HardwareSNTextBox1”而不是“HardwareSNTextBox1_AutoCompleteTextBox”,这是否可行?

编辑: 我想如果使用此自定义 Web 控件的开发人员在编写他们的 js 时检查实际 ID 的标记,那么这可能会起作用。不过不是很直观。

【问题讨论】:

标签: webforms asp.net-customcontrol


【解决方案1】:

一个非常好的方法是使用服务器控件的ClientID 属性,例如在您的EquipmentMove ASPX 页面中:

<form id="form1" runat="server">
    <div>
        <Custom:AutoCompleteTextBox runat="server" ID="HardwareSNTextBox1" />
        <input type="button" value="Test" onclick="javascript:TestOnClosefunction()" />
    </div>
</form>
<script type="text/javascript">
    function TestOnClosefunction() {
        var textBox = document.getElementById('<%= HardwareSNTextBox1.FindControl("AutoCompleteTextBox").ClientID %>');
        console.log(textBox.value);
    }
</script>

要验证它是否有效,只需单击 Test 按钮以在浏览器控制台中打印 TextBox 的值。

说明

嵌入服务器端代码行并在 JavaScript 中使用 ClientID 属性可确保始终发现您的服务器控件,无论其生成的 ID 是什么。

更新:也许我应该强调的是这一行:

var textBox = document.getElementById('&lt;%= HardwareSNTextBox1.FindControl("AutoCompleteTextBox").ClientID %&gt;');

变成:

var textBox = document.getElementById('HardwareSNTextBox1_AutoCompleteTextBox');

当页面运行时。与在 JavaScript 中对 ID 进行硬编码相比的优势在于,它的工作方式与 Control 的 ClientIDMode 属性设置的值无关。

【讨论】:

  • 这行不通。我应该在它运行时显示结果标记。自定义 Web 控件简单地变成一个 ID 为 HardwareSNTextBox1_AutoCompleteTextBox 的输入标记。没有创建其他标签。
  • @user3140169 你试过了吗?我使用了与您相同的 ID,因此您只需将其复制并粘贴到您的页面中即可。照原样,答案假设输入标签的 ID 是HardwareSNTextBox1_AutoCompleteTextBox。请试一试,然后告诉我。
  • 这仅在开发人员检查自定义 Web 控件以知道他们必须在名称中包含“_AutoCompleteTextBox”时才有效。我正在寻找更清洁的解决方案或希望有一个。
  • @user3140169 答案基于您的问题。如果您需要进一步的帮助,请使用更多详细信息和/或要求更新您的原始帖子或提出新问题。不要让我们猜测。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2018-12-30
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2016-04-12
相关资源
最近更新 更多