6

ASP.NET でカスタム スクリプト コントロールを作成しています。

コントロールの目的は、javascript ファイルをロードするために使用されるタグの単なるサーバー バリアントです。ただし、このコントロールの主な目的は、複数のスクリプトを 1 つの応答に結合して、クライアント側で各場所のタグのようなものを確認することです。 DocumentTop の場所に登録されたスクリプトは、場所「インライン」を除いて 1 つのタグに結合されます。すべてのインライン スクリプトは、マークアップに存在する場所で個別にレンダリングされます。実際の処理を行う httphandler js.ashx も作成しましたスクリプトの結合

「ヘッド」の場所を除いてすべて正常に機能しています。2 つのドキュメントの場所については、プリレンダリング中に 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 フェーズ中に変更できません。

カスタム コントロール内からページ ヘッダーにコントロールを追加する方法を知っている人はいますか?

ちなみに、このコントロールは、ネストされた 2 つのマスターがあり、ルート マスターに 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 に答える