【问题标题】:cannot access controls in asp.net application无法访问 asp.net 应用程序中的控件
【发布时间】:2019-04-02 16:00:26
【问题描述】:

我正在开发一个 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>

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

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

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

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

此位来自 Login.aspx.vb 页面

Partial Class _Default

再说一遍,id="span1" 在上面的代码中显示的位置非常好,但是当我将它移到里面时,我不能再引用它了。由于我正在谈论这个问题,因此我无法在其中添加任何新控件,因为我无法引用 vb.net 中的任何其他控件。 (这个表格几乎是从另一个项目中复制过来的,一切正常我只是不知道为什么我会遇到这个奇怪的问题)

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

编辑:&lt;span id="Span1" runat="Server" style="Color: Red"&gt;&lt;/span&gt;

【问题讨论】:

  • 我认为问题出在命名容器上。当您在模板内移动它时,它将成为Login1 控件的子控件,并将从设计器文件中删除。也许你可以在你的代码隐藏中尝试Login1.FindControl("span1")
  • @freefaller 我可以,因为我有 runat="server" 请查看编辑,这正是它的外观。我用它为它设置 .innerHtml 文本值
  • 那么,如果您没有向我们展示您实际拥有的东西,如果我们发现问题,请不要感到惊讶。请重新阅读我编辑的评论,这是我写它的主要原因
  • @freefaller 我很抱歉。这也不行。 Intellisense 确实捡到了它,当我做这样的事情时,我也会得到一条波浪线:Login1.FindControl("span1").InnerHtml="hello"。 asp:login 具有其他控件,例如文本框和按钮,无需通过在其前面加上 Login1.FindControl 来引用它。它仅由控件名称引用
  • .FindControl 返回一个对象,您需要将其装箱为正确的类型,然后才能对其调用任何属性/方法。类似CType(Logon1.FindControl("span1"), HtmlGenericControl).InnerHtml = "hello"

标签: asp.net vb.net login


【解决方案1】:

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

【讨论】:

    【解决方案2】:

    根据我的 cmets 和 OP 的要求...

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

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

    一旦它在 &lt;LayoutTemplate&gt; 内移动,它就会变成 &lt;asp:Login&gt; 控件的子控件。

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

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

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

    【讨论】:

      【解决方案3】:

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

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

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

      【讨论】:

      • 我很抱歉错过了这个花絮,但我确实有它 runat="server" 请参阅编辑。我没有完全复制/粘贴代码,我自己输入。
      猜你喜欢
      • 1970-01-01
      • 2020-02-25
      • 2021-06-02
      • 2019-11-05
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多