在ASP.NET中编写一个脚本标记

时间:2009-08-19 16:16:39

标签: asp.net

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

我想为每个页面添加跟踪脚本,但我不想包含<%= TrackingScript%>在每个主题母版页上。

我想从BasePage以编程方式执行此操作。

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

我的想法已经不多了,所以我在这里找到了某个答案吗?

2 个答案:

答案 0 :(得分: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;
        }

我更喜欢使用基本母版类的解决方案,该类公开了您的Page可以访问和操作的BodyTag属性。

答案 1 :(得分:0)

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

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

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