ClientScript.RegisterClientScriptBlock的替代方法?
ASP.NET函数ClientScript.RegisterClientScriptBlock可用于注册将在页面呈现时添加到页面的JavaScript代码块。这里的想法是,你可以有多个不同用户控件的实例试图反复注册相同的脚本,但这确保了它只会被包含一次。ClientScript.RegisterClientScriptBlock的替代方法?
问题是,你真的没有任何控制其中代码被添加到页面。这会将代码插入页面的BODY标记内,但我需要将某些内容(不限于JavaScript代码)添加到HEAD块中。
我很清楚的通过的ContentPlaceHolder块或“Head.Controls.Add但这些选项添加东西垫块没有解决的同样的事情,问题的各种方法添加多个倍。
有一个现有的办法做到这一点,还是我写的类,它类似于ClientScript.RegisterClientScriptBlock东西除了瞄准头部块?
我扔在一起的用户控件。在标记中没有任何内容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!"")");
是的,谢谢,但我已经做了一些或多或少的事情。我试图确保没有一些我忽略的本地解决方案。此外,这不会工作,因为它假定你正在做JavaScript。 –
为什么你需要* *的东西在头上? – mason
有许多事情只能在头部进行,例如meta标签,样式表链接等。 –
您的列表中显然没有包含脚本。 – mason