Динамические идентификаторы в пользовательском контроле, чтобы избежать дублирования на странице JavaScript и Asp.

У меня есть пользовательский элемент управления ASP.Net, в нем есть текстовое поле и список, я дал им уникальные идентификаторы и классы, в качестве пользовательского элемента управления, если я перетащу его дважды или более на странице asp.net, он не будет работать из-за те же идентификаторы при компиляции, см. код ниже -

 $("#liAutoCompleteTextBox").html("<ul class='ecm-autocomp-light'>");
              $("#ddlAutoCompleteTextBox > option").each(function () {
                  if($(this).text().toLowerCase().match(txtVal)) {
                      $("#liAutoCompleteTextBox").append("<li class='ecm-autocomp-light' onclick=updateToAutoCompleteTextBox('" + encodeURI(this.text) + "')><a onclick=updateToAutoCompleteTextBox('" +encodeURI( this.text) + "')>" + this.text + "</a></li>");
                      }
              });

Пользовательский элемент управления имеет сценарий, как показано выше, это всего лишь один пример.

И в aspx у нас есть,

<label class="input" id="AutoCompleteTextBoxText" runat="server">
    <asp:TextBox ID="txtAutoCompleteTextBox" AutoCompleteType="None" autocomplete="off" onfocusout="$('#liAutoCompleteTextBox').fadeOut()" onkeyup="liAutoCompleteTextBoxFunc()" runat="server" CssClass="input-sm isReq isRestrictedText txtAutoCompleteTextBoxCls"></asp:TextBox>
</label>
<label class="select" style="display: none">
    <asp:DropDownList ID="ddlAutoCompleteTextBox" ClientIDMode="Static" runat="server" CssClass="input-sm ddlAutoCompleteTextBoxCls">
    </asp:DropDownList>
    <i></i>
</label>
<div id="liAutoCompleteTextBox" class="customAutoCompDiv" style="position: absolute; display: none; padding: 5px; border: 1px #808080 solid; background: #fff; z-index: 1000; width: 90.5%;">
</div>

Я хочу сделать все идентификаторы полностью динамическими. Есть ли какой-то конкретный идентификатор элемента управления, который я могу использовать со всеми именами и классами, или есть ли другой способ справиться с этим?


person Muhammad Atif Agha    schedule 07.09.2017    source источник


Ответы (1)


Если вы измените liAutoCompleteTextBox div на панель (которая является div в html) и поместите скрипт в UserControl, тогда он будет работать. Когда это панель, у вас есть доступ к ней ClientID. Теперь независимо от того, сколько элементов управления вы разместили на родительской странице, javascript все равно будет ссылаться на правильные элементы управления.

 <!-- begin user control -->

<label class="input" id="AutoCompleteTextBoxText" runat="server">
    <asp:TextBox ID="txtAutoCompleteTextBox" AutoCompleteType="None" autocomplete="off" onfocusout="$('#liAutoCompleteTextBox').fadeOut()" onkeyup="liAutoCompleteTextBoxFunc()" runat="server" CssClass="input-sm isReq isRestrictedText txtAutoCompleteTextBoxCls"></asp:TextBox>
</label>
<label class="select" style="display: none">
    <asp:DropDownList ID="ddlAutoCompleteTextBox" ClientIDMode="Static" runat="server" CssClass="input-sm ddlAutoCompleteTextBoxCls">
    </asp:DropDownList>
    <i></i>
</label>

<asp:Panel ID="liAutoCompleteTextBox" runat="server" CssClass="customAutoCompDiv" Style="position: absolute; display: none; padding: 5px; border: 1px #808080 solid; background: #fff; z-index: 1000; width: 90.5%;"></asp:Panel>

<script type="text/javascript">
    $("#<%= liAutoCompleteTextBox.ClientID %>").html("<ul class='ecm-autocomp-light'>");
    $("#<%= AutoCompleteTextBoxText.ClientID %> > option").each(function () {
        if ($(this).text().toLowerCase().match(txtVal)) {
            $("#<%= liAutoCompleteTextBox.ClientID %>").append("<li class='ecm-autocomp-light' onclick=updateToAutoCompleteTextBox('" + encodeURI(this.text) + "')><a onclick=updateToAutoCompleteTextBox('" + encodeURI(this.text) + "')>" + this.text + "</a></li>");
        }
    });
</script>

<!-- end user control -->

Важно помнить, что когда Control и Control.ClientID находятся на одной и той же странице/UserControl, их идентификатор будет правильным.

person VDWWD    schedule 07.09.2017