【问题标题】:Control does not exist. Why?控制不存在。为什么?
【发布时间】:2011-09-07 15:18:08
【问题描述】:

我的设置如下。呈现页面时会引发此错误: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>

更新

如果我删除此调用:$("#&lt;%=UserName.ClientID %&gt;").focus(function () {,那么&lt;%=cvUserNameOrEmailRequired.ClientID %&gt; 会出现同样的错误

上面的代码在&lt;asp:Login&gt; 标记内,将它放在外面可以消除错误。

更新

我将 jQuery 代码移到了 &lt;asp:Login&gt; 之外,错误就消失了。我用过:

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

没有问题。但是为什么它在&lt;asp:Login&gt; 标签中不起作用呢?

【问题讨论】:

  • 在进行这样的内联插入时,我偶尔会遇到空白问题。我发现 ASP.NET 不能容忍不正确的空格,老实说我不知道​​官方/正确的格式。尝试向
  • @Matt,感谢您的建议,但它似乎没有用......
  • 您使用的是 .net 4.0 吗?如果是这样,您可以在 UserName 文本框上使用 ClientIDMode="Static",而不必担心 .net 会更改 id。它只是“用户名”
  • 这似乎也没有。
  • 我将您的代码复制到我的 ASP 应用程序中,并且没有波浪线。我什至在网上查了一下,文本框显示得很好。我知道这听起来很奇怪,但是尝试复制您粘贴在此页面上的代码,然后将其复制到您在 ASP 应用程序中的代码上。它以前对我有用。

标签: javascript asp.net


【解决方案1】:

Login 控件以及 RepeatersGridViews 等控件使用模板。这会将这些模板标签中的控件(如Login&lt;LayoutTemplate&gt;)从Page.Controls 列表中取出,并将它们放入Login 标签的Controls 列表中。因此,您需要在Login 控件列表中引用该控件。

此代码使用FindControl() 方法遍历控件的所有直接子级,以按名称查找ID。下面的完整代码将其显式转换为目标类型,但您可以转换为更通用的 Control,因为您只获取 ClientID 属性,这样会更容易:

((Control)Login1.FindControl("UserName")).ClientID

另外,Login 控件有点特殊,因为它需要具有特定 ID 的某些控件,因此它不会在 Login LayoutTemplate 中呈现文字的客户端 JavaScript 代码。因此,将文字 &lt;script&gt; 标记移出模板。当然这并不能解决引用问题,所以你仍然必须使用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>

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2023-03-12
    • 1970-01-01
    • 1970-01-01
    • 2017-12-26
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2017-09-02
    相关资源
    最近更新 更多