关于控件ID的试验(涉及MasterPage)

mac2022-06-30  53

地球人都知道asp.net页面加了MasterPage后会改变原来页面控件的ID.也隐约知道ID好像是一层一层父子关系嵌套下来的.但实际上真是这样吗?

今天我们就来试试实际会怎么样: (页面已经加MasterPage)

 

Html1     <div id="div1" runat="server">        <table id="table1" runat="server">            <tr id="tr1" runat="server">                <td id="td1" runat="server">                    <asp:Label ID="lbl1" runat="server" Text="aa"></asp:Label></td>                <td id="td2">                    <asp:Label ID="lbl2" runat="server" Text="bb"></asp:Label></td>            </tr>        </table>    </div>

 

产生的源代码如下:

 

Code1     <div>            <div id="ctl00_ContentPlaceHolder1_div1">        <table id="ctl00_ContentPlaceHolder1_table1">    <tr id="ctl00_ContentPlaceHolder1_tr1">        <td id="ctl00_ContentPlaceHolder1_td1">                    <span id="ctl00_ContentPlaceHolder1_lbl1">aa</span></td>        <td id="ctl00_ContentPlaceHolder1_td2">                    <span id="ctl00_ContentPlaceHolder1_lbl2">bb</span></td>    </tr></table>    </div>    </div>

 

可以看出所有控件都加上了"ctl00_ContentPlaceHolder1_",这个就是MasterPage的影响了.但是,这个好像没有我们印象中的层层包围哦!

我们再改一下代码,改成如下:

 

Html2     <div id="div1" runat="server">        <table id="table2" runat="server">            <tr id="tr2" runat="server">                <td id="td3" runat="server">                    <asp:Repeater ID="rpt1" runat="server">                        <ItemTemplate>                            <asp:Label ID="lbl3" runat="server" Text="aa"></asp:Label>                        </ItemTemplate>                    </asp:Repeater>                </td>            </tr>        </table>    </div>

 

在Page_load中加入:

 

Code2         string[] str = new string[] { "aa""bb" };        rpt1.DataSource = str;        rpt1.DataBind();

 

运行结果如下:

 

Code3     <div>            <div id="ctl00_ContentPlaceHolder1_div1">        <table id="ctl00_ContentPlaceHolder1_table2">    <tr id="ctl00_ContentPlaceHolder1_tr2">        <td id="ctl00_ContentPlaceHolder1_td3">                                                <span id="ctl00_ContentPlaceHolder1_rpt1_ctl00_lbl3">aa</span>                                                    <span id="ctl00_ContentPlaceHolder1_rpt1_ctl01_lbl3">aa</span>                                        </td>    </tr></table>    </div>    </div>

 

终于看到我们想要的结果了! Lable生成的<span> Id有嵌套Repter的Id了! ("太弱智了吧,这样也要试??" ~~好像听到很多嘘声-_-||)

 

既然大家都说太弱智了就不再研究了.总结一下:

1. 加MasterPage都会在Id前面加入类似"ctl00_ContentPlaceHolder1_"的前缀.无论多少层,都只加一个.

2.如果页面中存在重复控件(重复控件包括 Repeater、DataList 和 DataGridWeb 服务器控件(或任何在数据绑定时创建的包含重复功能的自定义服务器控件),它们充当其子控件的命名容器)的话,重复控件内部的控件Id前缀将加上重复控件Id一起作为改控件前缀,避免重复.

另外,在后台动态添加控件的话,如果你要取ClientID或者UniqueID的话..就要注意了.

 

Code3 string id = string.Empty;Table ht = new Table();ht.ID = "table1";TableRow tr = new TableRow();tr.ID = "row1";TableCell tc = new TableCell();tc.ID = "cell1";id = string.Format("<br /> Table Id:{0} <br /> Row Id:{1} <br /> Cell Id:{2}", ht.ClientID, tr.ClientID, tc.ClientID);this.div1.Controls.Add(ht);ht.Rows.Add(tr);id  += string.Format("<br /> Table Id:{0} <br /> Row Id:{1} <br /> Cell Id:{2}", ht.ClientID, tr.ClientID, tc.ClientID);        tr.Cells.Add(tc);this.lbl1.Text = id;

 

上边的代码,你想想会出现什么结果? 先自己想想...

实际显示输出如下:

 

Result1 Table Id:table1 Row Id:row1 Cell Id:cell1Table Id:ctl00_ContentPlaceHolder1_table1 Row Id:ctl00_ContentPlaceHolder1_row1 Cell Id:cell1  

 

但是页面HTML源代码是:

 

Result2     <div>            <div id="ctl00_ContentPlaceHolder1_div1">        <span id="ctl00_ContentPlaceHolder1_lbl1"><br /> Table Id:table1 <br /> Row Id:row1 <br /> Cell Id:cell1<br /><br /> Table Id:ctl00_ContentPlaceHolder1_table1 <br /> Row Id:ctl00_ContentPlaceHolder1_row1 <br /> Cell Id:cell1</span>    <table id="ctl00_ContentPlaceHolder1_table1" border="0">    <tr id="ctl00_ContentPlaceHolder1_row1">        <td id="ctl00_ContentPlaceHolder1_cell1"></td>    </tr></table></div>    </div>

 

可以看出ClientID和UniqueID都必须Add到最终的页面Control了之后,才能正确取到页面最终的ID.

这个试验也很弱智吧-_-||,,,做这个试验是因为今天和一同事争论到底控件ID是什么时候加载前缀的.是在Add之前还是之后..囧..码完字,闪了~~

转载于:https://www.cnblogs.com/KenBlove/archive/2008/12/25/1362490.html

最新回复(0)