控制項包含代碼塊,因此無法修改控制項集合

來源:互聯網
上載者:User

原文 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
歡迎轉載或分享,但請務必聲明文章出處。如果文章對您有協助,希望你能推薦或關注

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.