【问题标题】:Write a script tag just before </body> in ASP.NET在 ASP.NET 中的 </body> 之前写一个脚本标记
【发布时间】:2010-09-25 04:52:51
【问题描述】:

我有一个带有自定义主题的 ASP.NET 网站。这些主题是使用每个页面继承的 BasePage 调用的,其中 masterpagefile 是动态设置的。

我想为每个页面添加一个跟踪脚本,但我不想在每个主题母版页上都包含一个 。

我想从 BasePage 以编程方式完成。

RegisterStartupScript 不起作用,因为不是每个页面都包含一个表单 runat="server"...

我的想法已经不多了,所以我想这里有人有答案吗?

【问题讨论】:

    标签: asp.net


    【解决方案1】:

    我在这里有一个解决方案,但我不会强烈推荐它。它具有与开发人员忘记放入脚本标签块或让他们记住放入“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 属性。

    【讨论】:

    • 最好让 BaseMasterPage 自动添加脚本。
    • 同意。虽然我以为你说你想从你的基页类中做到这一点。如果基础母版页适合您,那就更好了,它可以找到自己的正文标记。
    • 好的。我只是想知道这如何影响性能。在每个页面视图上循环遍历控件集合...?
    • 只要您没有数千个控件,并且您没有递归搜索页面上的每个控件(如果您只是在顶部寻找文字,则不需要页面的控制层次结构的级别),那么我怀疑它是否明显。如果您担心,您甚至可以缓存需要添加的索引。
    • 在 DataBind、Init、Load、PreRender 或 Unload 阶段不能修改控件集合。猜猜我必须在 PreInit 上做,也许?
    【解决方案2】:

    如果您有内联代码或其他障碍来修改 Controls 集合,则 Response.Filter 属性可能会很有用:

    http://aspnet.4guysfromrolla.com/articles/120308-1.aspx

    否则 Page.Master.FindControl("placeHolder"),或使用以编程方式添加控件的 BaseMasterPage。

    【讨论】:

      猜你喜欢
      • 2018-08-13
      • 1970-01-01
      • 2012-06-25
      • 2011-10-13
      • 1970-01-01
      • 2018-08-16
      • 1970-01-01
      • 2015-08-19
      • 1970-01-01
      相关资源
      最近更新 更多