2016-04-25 5 views
-1

ASP.NET関数ClientScript.RegisterClientScriptBlockは、レンダリング時にページに追加されるJavaScriptコードのチャンクを登録するために使用できます。ここでのアイデアは、さまざまなユーザーコントロールの複数のインスタンスに同じスクリプトを何度も登録しようとする可能性があることです。ただし、これにより、一度しか含まれないことが保証されます。ClientScript.RegisterClientScriptBlockの代わりに?

問題は、実際にはのコードがのコードに追加されているということです。これにより、ページのBODYタグ内にコードが挿入されますが、HEADブロックに何か(JavaScriptコードに限定されない)を追加する必要があります。

私は「Head.Controls.AddのContentPlaceHolderブロックを介してヘッドブロックに何かを追加するか、によって様々な方法をよく承知しているが、これらのオプションは同じものを追加されている複数の問題に対処していません回。

はこれを行うには、既存の方法はありますか、私はHEADブロックをターゲット以外ClientScript.RegisterClientScriptBlockに似た何かをするクラスを記述する必要がありますか?

+0

なぜあなたは* *頭の中で何かが必要なのでしょうか? – mason

+0

メタタグ、スタイルシートリンクなど、頭の中だけにあるものはたくさんあります。 –

+0

あなたのリストには、スクリプトは含まれていません。 – mason

答えて

0

私は一緒にユーザーコントロールを投げました。マークアップには何もありません

public partial class ScriptControl : System.Web.UI.UserControl 
{ 
    private Dictionary<string, string> _scripts = new Dictionary<string, string>(StringComparer.OrdinalIgnoreCase); 

    public void RegisterScript(string key, string script) 
    { 
     if(!_scripts.ContainsKey(key)) _scripts.Add(key, script); 
    } 

    protected override void Render(HtmlTextWriter writer) 
    { 
     writer.WriteFullBeginTag("script"); 
     foreach(var script in _scripts.Values) writer.Write(script); 
     writer.WriteEndTag("script"); 
    } 
} 

ちょうどあなたのページのマークアップにディレクティブを追加します:LL、あなただけの新しいWebプロジェクトにユーザーコントロールをフォームに追加し、背後にあるコードでこれを置くことができるので、

<%@ Register TagPrefix="uc" TagName="ScriptControl" 
    Src="ScriptControl.ascx" %> 

(ここで " ScriptControl.ascx "はコントロールの名前は何でも構いません) そして必要な場所(ヘッダーなど)に追加できます。

<head runat="server"> 
    <uc:ScriptControl id="HeaderScriptControl" runat="server"/> 
</head> 

使用量はほとんど同じです:

HeaderScriptControl.RegisterScript("myScript", 
    @"alert(""hello, world!"")"); 
+0

ええ、ありがとうございます。私は見落としていたネイティブの解決策がないことを確認しようとしていました。また、JavaScriptを使用していると仮定しているため、これは機能しません。 –