我的设置如下:在呈现页面时,它抛出这个错误: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>
标签内工作?
Login
控件,以及其他像Repeaters
和GridViews
控件,使用模板。这将这些模板标签中的控件(如Login
的<LayoutTemplate>
)从Page.Controls
列表中取出,并将它们放入Login
标签的Controls
列表中。因此,您需要在Login
控件的列表中引用该控件。
此代码使用FindControl()
方法,该方法遍历控件的所有直接子元素,按名称查找ID。下面的完整代码显式地将其转换为目标类型,但是如果更容易的话,您可以将其转换为更通用的Control
,因为您只获得了ClientID属性:
((Control)Login1.FindControl("UserName")).ClientID
此外,Login
控件有点特殊,因为它期望某些具有特定id的控件,因此它不会在Login
LayoutTemplate
中呈现字面的客户端JavaScript代码。因此,将文字<script>
标记移到模板之外。当然,这并不能解决引用问题,因此您仍然必须使用FindControl()
获取对子控件的引用。
<asp:Login ID="Login1" runat="server">
<LayoutTemplate>
<asp:TextBox ID="Password" runat="server" Width="136px"></asp:TextBox>
<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>
</LayoutTemplate>
</asp:Login>
<script type="text/javascript">
function UsernameValidateTextBox(source, arguments) {
if (arguments.Value % 2 == 0) {
arguments.IsValid = false;
} else {
arguments.IsValid = true;
}
}
$("#<%= ((TextBox)Login1.FindControl("UserName")).ClientID %>").focus(function () {
$("#<%=((CustomValidator)Login1.FindControl("cvUserNameOrEmailRequired")).ClientID %>").css({ visibility: "hidden" });
});
</script>