我有一个简单的ASP.Net页面,我通过反射来控制对控件的控制(局部化页面 - 但这是管理dictat类型蠕虫的其他整体)。所以......我有一个测试页面:
<%@ Page Title="" Language="C#" MasterPageFile="~/Master Pages/Root.master" AutoEventWireup="true" CodeFile="refelectiontest.aspx.cs" Inherits="refelectiontest" %>
<asp:Content ID="Content1" ContentPlaceHolderID="ContentPlaceHolder1" Runat="Server">
<asp:Button ID="Button1" runat="server" Text="Button" />
<asp:Label ID="Label1" runat="server" Text="Label"></asp:Label><asp:Label ID="Label2"
runat="server" Text="Label"></asp:Label>
<asp:Label ID="Label3" runat="server" Text="Label"></asp:Label>
</asp:Content>
然后在后面的代码中,我想迭代控件......
所以我有这个(母版页可以处理自己)
protected void Page_Load(object sender, EventArgs e)
{
if (!IsPostBack)
{
try
{
foreach (Control ctrl in Form.Controls)
{
if (ctrl is ContentPlaceHolder)
{
ContentPlaceHolder chp = ctrl as ContentPlaceHolder;
foreach (Control control in chp.Controls)
{
string strID = control.ID;
//do stuff based on the the ID
}
}
}
}
catch (Exception ex)
{
Response.Write(ex.ToString());
}
}
}
现在,如果我只是运行它,它会使用对象null异常barfs。如果我单步执行代码,在control.ID行上放置一个断点,那么ID确实为null。但是,如果我然后展开控制对象,ID就会填满,一切都很好。
看起来ID只是在最后一刻才完成 - 如何确保我可以获得ID而不会获得null? 如果我不使用母版页,也会发生同样的事情。 感谢。
答案 0 :(得分:1)
我不知道这是否有任何帮助,但您可以使用control.UniqueID。它对我来说很好,我有同样的错误,这让我困扰了好几个小时。 根据我的说法,代码应该是这样的代码:
protected void Page_Load(object sender, EventArgs e)
{
if (!IsPostBack)
{
try
{
foreach (Control ctrl in Form.Controls)
{
if (ctrl is ContentPlaceHolder)
{
ContentPlaceHolder chp = ctrl as ContentPlaceHolder;
foreach (Control control in chp.Controls)
{
string strID = control.UniqueID;
//do stuff based on the the ID
}
}
}
}
catch (Exception ex)
{
Response.Write(ex.ToString());
}
}
}
答案 1 :(得分:0)
Response.ClearContent();
Response.ClearHeaders();
Response.ContentType = "text/plain";
foreach (Control ctrl in this.Form.Controls)
{
//Response.Write("ID: " + ctrl.ID + "\n");
//Response.Write("ClientID: " + ctrl.ClientID + "\n");
if ((ctrl as ContentPlaceHolder) != null)
{
ContentPlaceHolder chp = ctrl as ContentPlaceHolder;
Response.Write("Content Found" + "\n");
foreach (Control control in chp.Controls)
{
string strID = control.ID;
Response.Write("Control in content: " + strID + "\n");
//do stuff based on the the ID
}
}
}
Response.End();`
该代码输出ContentPlaceHolder中的ID。其中一些是空的,所以你需要过滤它。
希望这有帮助
答案 2 :(得分:0)
我注意到内容容器的runat="server"
标记并非都是小写的。我不知道这很重要,但它可能是区分大小写的。这是MSDN页面:http://msdn.microsoft.com/en-us/library/ms529174%28v=vs.85%29.aspx