我有一个带有自定义主题的ASP.NET网站。这些主题是使用每个页面继承的BasePage调用的,其中masterpagefile是动态设置的。
我想为每个页面添加跟踪脚本,但我不想包含<%= TrackingScript%>在每个主题母版页上。
我想从BasePage以编程方式执行此操作。
RegisterStartupScript不起作用,因为不是每个页面都包含一个表单runat =“server”......
我的想法已经不多了,所以我在这里找到了某个答案吗?
答案 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。