2009-08-19 61 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

相关问题