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

时间:2019-04-02 16:00:27

标签: asp.net vb.net login

我正在研究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">位于我的Web表单内,位于页面的Content部分内。我可以在我的CodeBehind中轻松访问它,并做我想做的任何事情。但是,如果我移动该跨度并将其放到页面的<asp:login>部分中,它似乎无法识别,就不会让我在后面的代码中访问它,这给了我一条弯曲的蓝线并说

  

span1未声明。由于保护级别,它可能无法访问

这是设计器中Web表单的顶部

<%@ 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>

3 个答案:

答案 0 :(得分:2)

您需要在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"

答案 1 :(得分:1)

要访问服务器端的控件,必须在标签上包含“ runat ='server'”属性。那就是告诉.NET的原因,任何给定的控件都应该在服务器端以及前端都可以使用。

请注意,它将更改在呈现的HTML中生成的ID

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

答案 2 :(得分:1)

根据我的评论,以及OP的要求...

您遇到命名容器问题。

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

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

因此,要访问该控件,您可以使用以下...

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

FindControl将带回一个对象,但需要先将其“装箱”为正确的类型,然后才能访问InnerHtml属性