ClientScript.RegisterClientScriptBlock的替代方法?

问题描述:

ASP.NET函数ClientScript.RegisterClientScriptBlock可用于注册将在页面呈现时添加到页面的JavaScript代码块。这里的想法是,你可以有多个不同用户控件的实例试图反复注册相同的脚本,但这确保了它只会被包含一次。ClientScript.RegisterClientScriptBlock的替代方法?

问题是,你真的没有任何控制其中代码被添加到页面。这会将代码插入页面的BODY标记内,但我需要将某些内容(不限于JavaScript代码)添加到HEAD块中。

我很清楚的通过的ContentPlaceHolder块或“Head.Controls.Add但这些选项添加东西垫块没有解决的同样的事情,问题的各种方法添加多个倍。

有一个现有的办法做到这一点,还是我写的类,它类似于ClientScript.RegisterClientScriptBlock东西除了瞄准头部块?

+0

为什么你需要* *的东西在头上? – mason

+0

有许多事情只能在头部进行,例如meta标签,样式表链接等。 –

+0

您的列表中显然没有包含脚本。 – mason

我扔在一起的用户控件。在标记中没有任何内容LL,所以你可以添加一个新的Web窗体用户控件到您的项目,并把这个在后面的代码:

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"); 
    } 
} 

只需将该指令添加到您的网页标记:

<%@ 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。 –