GetElementById не находит контроль, сгенерированный ASP.net

Я просто пытаюсь сохранить метку в переменной в javascript, но по какой-то причине это не работает с document.getElementById('control');. Я знаю, что мой javascript привязывается к моему html файлу, потому что все остальное работает.

Вот мой код javascript:

function performEvapCooledCircuit(txt)
{
    var error = document.getElementById('lblError');


    if (txt.value == null || isNaN(txt.value))
    {
       error.style.visibility = "visible";
    }
}

Вот код html для моей метки:

<asp:Label ID="lblError" class="NormLabel" runat="server" 
   style="color:red; visibility:hidden;" Text="Invalid Input."></asp:Label>

Я получаю сообщение об ошибке, предполагающее ожидаемый объект

Ответы

Ответ 1

Идентификатор, который генерирует ASP.NET, не будет "lblError", поэтому вам нужно будет ссылаться на его ClientID

document.getElementById('<%=lblError.ClientID %>');

Если ваш файл javascript является внешним, мне обычно приходилось писать тип метода "Init" javascript, чтобы убедиться, что мой идентификатор был настроен как свойство

На странице ASPX:

<script type="text/javascript">
    var lblError = null;
    function InitializeVariables()
    {
        if (lblError == null) // make sure you only do this once
        {
            lblError = document.getElementById("<%=lblError.ClientID %>");
        }
    }
</script>
<asp:Label 
    ID="lblError"
    class="NormLabel"
    runat="server" 
    style="color:red; visibility:hidden;"
    Text="Invalid Input."></asp:Label>

Затем в вашем файле javascript вам нужно вызвать InitializeVariables(), чтобы убедиться, что у вас есть переменные, указывающие на правильные элементы управления asp.net

function performEvapCooledCircuit(txt)
{
    InitializeVariables();

    if (txt.value == null || isNaN(txt.value))
    {
        lblError.style.visibility = "visible";
    }
}

Ответ 2

"hunter" дает довольно солидный способ сделать что-то, однако, по моему мнению, гораздо лучший способ - использовать свойство "CliendIDMode" в элементе управления и установить это свойство в "Static". Это сделает идентификаторы клиента и сервера одинаковыми. Вот так:

<asp:TextBox ID="ServerAndClientId" runat="server" ClientIDMode="Static" />

Ответ 3

Идентификатор метки не "lblError". Двигатель ASP.net изменил идентификатор. Проверьте исходный код HTML в браузере, чтобы узнать реальный идентификатор.

Ответ 4

Это не HTML для метки, то есть элемент управления ASP.NET, который будет отображаться в HTML до его отправки в ответ. Элементы управления ASP.NET WebForms иногда меняют идентификатор для создаваемого HTML.

Просмотрите источник веб-страницы, чтобы узнать, что идентификатор элемента HTML находится на отображаемой странице.

Ответ 5

Вы можете использовать это:

document.getElementById('<%= lblError.ClientID %>').click()

Начиная с ASP.NET 4.0 вы можете использовать свойство ClientIDMode для элемента. И если вы установите его в Static, то значение ClientID будет установлено в значение свойства ID:

 <asp:Label ID="lblError" runat="server" ClientIDMode="Static" />

будет отображаться как нечто подобное:

<span id="lblError" name="ctl00$MasterPageBody$ctl00$Label1" />