我正在研究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>
答案 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
属性