无法访问 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
属性
我正在开发 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
属性