getElementById没有找到ASP.net生成的控件

Joh*_*rad 15 javascript asp.net getelementbyid

我只是试图在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";
    }
}
Run Code Online (Sandbox Code Playgroud)

这是我的标签的html代码:

<asp:Label ID="lblError" class="NormLabel" runat="server" 
   style="color:red; visibility:hidden;" Text="Invalid Input."></asp:Label>
Run Code Online (Sandbox Code Playgroud)

我得到一个错误,说对象预期?

hun*_*ter 20

ASP.NET将生成的ID不会是"lblError",因此您需要通过它来引用它 ClientID

document.getElementById('<%=lblError.ClientID %>');
Run Code Online (Sandbox Code Playgroud)

如果你的javascript文件是外部的,我通常不得不写一种"Init"javascript方法来确保我的ID设置为属性

在您的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>
Run Code Online (Sandbox Code Playgroud)

然后在你的javascript文件中,你必须调用InitializeVariables()以确保你有变量指向正确的asp.net控件

function performEvapCooledCircuit(txt)
{
    InitializeVariables();

    if (txt.value == null || isNaN(txt.value))
    {
        lblError.style.visibility = "visible";
    }
}
Run Code Online (Sandbox Code Playgroud)


Mav*_*ick 6

"猎人"提供了一种非常可靠的做事方式,但是,在我看来,更好的方法是在控件上使用"CliendIDMode"属性并将该属性设置为"静态".这将使客户端和服务器ID相同.像这样:

<asp:TextBox ID="ServerAndClientId" runat="server" ClientIDMode="Static" />
Run Code Online (Sandbox Code Playgroud)

  • 哇谢谢。但是[this](http://stackoverflow.com/questions/6057490/is-there-any-drawback-to-set-clientidmode-static-on-every-object-set-on-main)帖子说有一些使用这个的缺点。 (2认同)