原文 http://www.cnblogs.com/jsonzheng/archive/2011/01/18/1938403.html
-
控制項包含代碼塊(即<% ... %>),因此無法修改控制項集合。
-
說明: 執行當前 Web 請求期間,出現未處理的異常。請檢查堆疊追蹤資訊,以瞭解有關該錯誤以及代碼中導致錯誤的出處的詳細資料。
異常詳細資料: System.Web.HttpException: 控制項包含代碼塊(即 <% ... %> ),因此無法修改控制項集合。
-
一、錯誤例子解說:
-
<asp:Panel ID="p_Time" runat="server">
<%= DateTime.Now.ToString("HH-mm")%>
</asp:Panel>
Label lb=new Label();
lb.Text = "目前時間";
p_Time.Controls.Add(lb);
以上代碼執行的時候,將會產生該錯誤。由於p_Time控制項中包含了代碼塊(即<% ... %>),無法修改控制項集合,所以當執行語句p_Time.Controls.Add(lb)時會產生錯誤。
-
二、通常出錯的地方以及解決方案
-
通常在頁面代碼的head部分的javascript代碼中通過<%=this.control.ClientID%>來擷取伺服器控制項標識符(代碼如下所示)等,當應用主題等功能的時候,伺服器指令碼會向Header動態添加控制項,而引發錯誤。?
<html xmlns="http://www.w3.org/1999/xhtml"> <head runat="server"> <script type="text/javascript"> function showTime() { var now = new Date(); var lbTime = document.getElementById('<%= this.lb_Time.ClientID %>'); lbTime.innerHTML = now.getHours() + ":" + now.getMinutes(); } </script> </head> <body> <asp:Label ID="lb_Time" runat="server" Text="lb_Time"></asp:Label> <input id="btn_Show" type="button" value="button" onclick="return showTime()" /> </body></html> |
解決方案如下:
-
1、把javascript放到body中
-
2、聲明自訂控制項來代替包含了代碼塊(即<% ... %>)
-
控制項代碼:?
public class ControlInfoWriter : Control{ private string writerControlID; private string writerProperty; public string WriterControlID { get { return writerControlID; } set { writerControlID = value; } } public string WriterProperty { get { return writerProperty; } set { writerProperty = value; } } protected override void Render(System.Web.UI.HtmlTextWriter writer) { object writerControl = this.Parent.FindControl(writerControlID);//尋找要輸出的控制項 Type t = writerControl.GetType();//擷取控制項的類型 PropertyInfo pi = t.GetProperty(writerProperty);//擷取要輸出的屬性 string value = pi.GetValue(writerControl, null).ToString();//得到控制項的屬性值 writer.Write(value); base.Render(writer); }} |
head中的javascript修改如下:?
<script type="text/javascript">function showTime(){ var now = new Date(); var lbTime = document.getElementById('<CustomControl:ControlInfoWriter ID="controlInfoWriter" WriterControlID="lb_Time" WriterProperty="ClientID" runat="server" />'); lbTime.innerHTML = now.getHours() + ":" + now.getMinutes();}</script> |
註:頁面代碼中要註冊控制項CustomControl:ControlInfoWriter
作者:鄭某人
出處:http://jsonzheng.cnblogs.com
歡迎轉載或分享,但請務必聲明文章出處。如果文章對您有協助,希望你能推薦或關注