无法访问 asp.net 应用程序中的控件

cannot access controls in asp.net application

我正在开发 ASP.NET VB.NET Web 应用程序。我从我们内部的另一个应用程序中继承了一堆表格。在登录页面上工作时,我 运行 遇到了一个非常奇怪的问题。

这是我的代码的缩写版本:

<asp:Content ID="Content2" ContentPlaceHolderID="MainContent" runat="Server">
  <table> 
    <tr> 
      <td>
          <span id="Span1" runat="Server" style="Color: Red"></span>
      </td>
    </tr>
    <tr>
      <td>
        <asp:Login ID="Login1" runat="server">
         <LayoutTemplate>
           <table>
           <tr>
             <td> 
                <span id="Span1" runat="Server" style="Color: Red"></span>
             </td>
           </tr>
           </table>
          </LayoutTemplate>
       </asp:login>
     </td>
    </tr>
   </table>
</asp:Content>

我有一个 <span id="span1"> 位于我的网络表单中,在页面的 Content 部分。我可以在我的 CodeBehind 中轻松访问它,并用它做任何我想做的事情。但是,如果我移动该跨度并将其放入页面的 <asp:login> 部分,它似乎无法识别它,它不会让我在后面的代码中访问它,它给了我一条波浪形的蓝线并说

span1 is not declared. It may inaccessible due to protection level

此位来自设计器中网络表单的顶部

<%@ Page Language="VB" AutoEventWireup="false" CodeFile="Login.aspx.vb" Inherits="_Default" MasterPageFile="~/Site.master" %>

此位来自 Login.aspx.vb 页面

Partial Class _Default

再说一遍,id="span1" 在上面的代码中显示的地方工作得很好,但是当我将它移到里面时,我不能再引用它了。因为我在谈论这个问题,所以我不能在里面添加任何新控件,因为我不能引用 vb.net 中的任何其他控件。 (这个表格几乎是从另一个项目复制的,一切正常我只是不确定为什么我会遇到这个奇怪的问题)

我注意到很多人都有类似的问题,但就我而言,我正在使用 <asp:login>,我真的不确定它如何影响我的控件。

编辑:<span id="Span1" runat="Server" style="Color: Red"></span>

要访问服务器端的控件,您必须在标记中包含 "runat='server'" 属性。这就是告诉 .NET 任何给定的控件都应该在服务器端和前端一起工作的原因。

请注意,它会更改渲染中生成的 ID HTML

<span id="span1" runat="server"></span>

您需要在 Login1 控件上使用 FindControl

HtmlGenericControl hgc = Login1.FindControl("Span1") as HtmlGenericControl;
hgc.InnerText = "Span Found";

VB

Dim hgc As HtmlGenericControl = CType(Login1.FindControl("Span1"),HtmlGenericControl)
hgc.InnerText = "Span Found"

根据我的意见,并应 OP 的要求...

您遇到了命名容器的问题。

<span runat="server"><asp:Login><LayoutTemplate> 之外时,它作为一个对象存在于页面中,您可以直接引用它。

一旦它在 <LayoutTemplate> 内移动,它就会成为 <asp:Login> 控件的子控件。

所以要访问控件,您可以使用以下...

CType(Logon1.FindControl("span1"), HtmlGenericControl).InnerHtml = "hello"

FindControl会带回一个对象,但需要"boxed"转换为正确的类型才能访问InnerHtml属性