2009-08-19 75 views
0

我有一個帶有自定義主題的ASP.NET網站。這些主題是使用每個頁面繼承的BasePage調用的,其中masterpagefile是動態設置的。在ASP.NET中的</body>之前編寫腳本標記

我想爲每個頁面添加一個跟蹤腳本,但我不想在每個主題主頁上包含<%= TrackingScript%>。

我想從BasePage以編程方式執行此操作。

的RegisterStartupScript將無法正常工作,因爲不是每個頁面包含一個形式RUNAT =「服務器」 ...

我跑出來的想法,所以我因子評分someine在這裏有一個答案?

回答

0

我在這裏有一個解決方案,但它不是我會強烈建議的。它有着與開發人員忘記放入腳本標記塊或讓他們記住放置「body runat = server」或其他此類技術的脆弱性相同,但它們稍微不會忘記「」標籤。

基本上,您可以在PreRender期間迭代頁面中的文字標記,找到關閉的正文標記並在其之前插入腳本。但是,如果您的母版頁開發人員忘記了/ body標籤,它將無法工作。你可以加強它以尋找/ html或最糟糕的,只是簡單地做一個Page.Controls.Add()使它出現在所有東西之後,但這不是有效的html。

下面的代碼(改編自一個簡單的例子,我發現here):

public void Page_PreRender(object sender, EventArgs e) 
     { 
      int x = -1; 
      var control = FindBodyTag(this, out x); 
      this.Page.Controls.AddAt(x, new LiteralControl("test")); 
     } 


     public LiteralControl FindBodyTag(Control parentCtl, out int ctlPos) 
     { 
      LiteralControl bodyTag = null; 
      ctlPos = -1; 
      for (int i = 0; i < parentCtl.Controls.Count; i++) 
      { 
       var currentCtl = parentCtl.Controls[i]; 
       if (currentCtl is LiteralControl) 
       { 
        int iPos = (currentCtl as LiteralControl).Text.ToLower().IndexOf("</body"); 
        if (iPos > -1) 
        { 
         ctlPos = i; 
         break; 
        } 
       } 
      } 
      return bodyTag; 
     } 

我寧願與暴露你的頁面可以訪問和操作BodyTag財產基母版類的解決方案。

+0

最好的事情是讓BaseMasterPage自動添加腳本。 – MartinHN 2009-08-19 17:02:48

+0

同意。雖然我以爲你說過你想從你的基礎課上做到這一點。如果一個基礎母版頁面可以爲你工作,甚至更好,它可以找到它自己的身體標籤。 – womp 2009-08-19 17:21:01

+0

好的。我只是想知道如何影響性能。在每個頁面視圖中遍歷控件集合...? – MartinHN 2009-08-19 17:50:54

相關問題