枚举时asp.net表单控件ID为null

时间:2011-04-02 11:36:17

标签: c# asp.net

我有一个简单的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? 如果我不使用母版页,也会发生同样的事情。 感谢。

3 个答案:

答案 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