6

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

控件的目的只是标签的服务器变体,用于加载 javascript 文件 然而,此控件的主要目的是将多个脚本组合成一个响应,因此在客户端他们看到每个位置的标签之类的东西,所以所有在 DocumentTop 位置注册的脚本将组合成一个标记,但位置“内联”除外,所有内联脚本都在标记中存在的位置单独呈现我还创建了一个 httphandler,js.ashx,它确实脚本的组合

除了“头”位置外,一切都工作正常,对于两个文档位置,我只是在预渲染期间使用 ClientScriptManager,但对于头位置,我在预渲染期间尝试了以下代码

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

4 回答 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";
}
于 2009-05-20T22:40:26.657 回答
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 方法

于 2009-05-20T21:39:53.877 回答
1
protected override void OnInit(EventArgs e)
{
    EnsureChildControls();
    base.OnInit(e);
}
于 2012-10-21T12:34:47.203 回答
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);

    }
于 2010-11-03T23:37:55.123 回答