控制不存在。为什么?

时间:2011-09-07 15:18:09

标签: javascript asp.net

我的设置如下。渲染页面时会抛出此错误:The name 'UserName' does not exist in the current context。我不明白为什么因为我的控制权就在电话会议之上。我在一个单独的控件中有相同的设置,它工作得很好。谁能解释一下呢?

<asp:TextBox ID="UserName" runat="server" Width="136px"></asp:TextBox>

<asp:CustomValidator ID="cvUserNameOrEmailRequired" ValidationGroup="LoginForm" 
    runat="server" CssClass="input-error" ErrorMessage="Username is required"
    ControlToValidate="UserName" Display="Dynamic" 
    ClientValidationFunction="UsernameValidateTextBox" ValidateEmptyText="True">
    </asp:CustomValidator>

<script type="text/javascript">
    function UsernameValidateTextBox(source, arguments) {
        if (arguments.Value % 2 == 0) {
            arguments.IsValid = false;
        } else {
            arguments.IsValid = true;
        }
    }
    **//ERROR IS THROWN HERE**
    $("#<%=UserName.ClientID %>").focus(function () {
        $("#<%=cvUserNameOrEmailRequired.ClientID %>").css({ visibility: "hidden" });
    });
</script>

更新

如果我删除了这个电话:$("#<%=UserName.ClientID %>").focus(function () {我就会为<%=cvUserNameOrEmailRequired.ClientID %>

收到同样的错误

上面的代码位于<asp:Login>标记内,将其放在外面可以删除错误。

更新

我将jQuery代码移到<asp:Login>之外,错误就消失了。我用过:

$('#<%=LoginForm.FindControl("UserName").ClientID%>').focus(function () {
    $('#<%=LoginForm.FindControl("cvUserNameOrEmailRequired").ClientID%>')
        .css({ visibility: "hidden" });
});

没问题。但为什么它不能在<asp:Login>标签内工作?

1 个答案:

答案 0 :(得分:7)

Login控件,例如RepeatersGridViews,使用模板。这会从Login列表中获取<LayoutTemplate>的{​​{1}}之类的模板标记中的控件,并将它们放入Page.Controls标记的Login中名单。因此,您需要在Controls控件列表中引用控件。

此代码使用Login方法,该方法遍历控件的所有直接子节点,按名称查找ID。下面的完整代码显式地将其强制转换为目标类型,但如果因为您只获取ClientID属性会更容易,则可以转换为更通用的FindControl()

Control

此外,((Control)Login1.FindControl("UserName")).ClientID控件有点特别之处在于它需要具有特定ID的某些控件,因此它不会在Login {{1中呈现文字的客户端JavaScript代码}}。因此,将文字Login标记移到模板之外。这当然不能解决参考问题,因此您仍然必须使用LayoutTemplate来获取对子控件的引用。

<script>