在ASP.NET中向页面头部添加控件

6

我正在ASP.NET中创建一个自定义脚本控件

该控件的目的只是作为服务器版本的<script>标记,用于加载javascript文件。但该控件的主要目的是将多个脚本组合成一个响应,因此在客户端上,他们会看到每个位置对应的<script>标记。所有在DocumentTop位置注册的脚本都将被组合成一个单独的<script>标记,除了"inline"位置外,所有内联脚本都将在标记中单独呈现。

我还创建了一个httphandler,js.ashx,用于实际合并脚本

一切工作正常,除了"Head"位置。对于两个文档位置,我仅需在prerender期间使用ClientScriptManager,但是对于"Head"位置,在prerender期间尝试了以下代码:

var scriptControl = new HtmlGenericControl("script");
scriptControl.Attributes["language"] = "javascript";
scriptControl.Attributes["type"] = "text/javascript";
scriptControl.Attributes["src"] = src;
Page.Header.Controls.Add(scriptControl);

我收到了以下错误信息: 在DataBind、Init、Load、PreRender或Unload阶段,无法修改控件集合。

有没有人知道如何在自定义控件内部向页面标题添加控件?

顺便提一下,该控件用于一个包含两个嵌套主控件和在根主控件上注册了ScriptManager的内容页。 该项目是一个asp.net 3.5 Web应用程序项目。

4个回答

9

我已经找到了我的问题的答案。

虽然我不太明白原因,但问题在于当我尝试将脚本控件添加到头部时,在控件的PreRender事件中这样做会导致错误,但是如果你在页面的PreRender事件中添加控件,则一切都能正常工作。

例如:

protected override void OnInit(EventArgs e)
{
    base.OnInit(e);
    this.Page.PreRender += new EventHandler(Page_PreRender);
}

void Page_PreRender(object sender, EventArgs e)
{
    var scriptControl = new HtmlGenericControl("script");
    Page.Header.Controls.Add(scriptControl);
    scriptControl.Attributes["language"] = "javascript";
    scriptControl.Attributes["type"] = "text/javascript";
    scriptControl.Attributes["src"] = "blah.js";
}

3
我不知道您为什么会出现这个错误,但是尝试使用ClientScript如下所示:
protected void Page_Load(object sender, EventArgs e)
{
    string scriptFile = "myscriptFile.js";

    if (!this.Page.ClientScript.IsClientScriptIncludeRegistered("myScript"))
    {
        this.Page.ClientScript.RegisterClientScriptInclude("myScript", scriptFile);
    }
}

ClientScriptManager.RegisterClientScriptInclude 方法

该方法是ASP.NET中的一个函数,用于向页面注册客户端脚本文件。详情请查看链接。

你好 Canavar, 我成功地使用了 Page.ClientScript 来在文档主体中注册脚本,但问题是尝试在 <head> 标签中注册一个脚本标签。据我所知,this.Page.ClientScript.RegisterClientScriptInclude 会在 body 中的 <form> 标签后面注册 js。 - Lightweight

1
protected override void OnInit(EventArgs e)
{
    EnsureChildControls();
    base.OnInit(e);
}

5
欢迎来到Stack Overflow!为了提高文章的准确性,最好对示例代码进行简短的描述 :) - Picrofo Software

0
  protected void Page_Load(object sender, EventArgs e)
    {        
        HtmlGenericControl js = new HtmlGenericControl("script");
        js.Attributes["type"] = "text/javascript";
        js.Attributes["src"] = yol.ScriptYol("jquery-1.3.2.min.js");
        this.Page.Header.Controls.Add(js);

    }

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接