繁体   English   中英

替代 ClientScript.RegisterClientScriptBlock?

[英]Alternative to ClientScript.RegisterClientScriptBlock?

ASP.NET 函数ClientScript.RegisterClientScriptBlock可用于注册一段 JavaScript 代码,这些代码将在页面呈现时添加到页面中。 这里的想法是,您可以有各种用户控件的多个实例,试图一遍又一遍地注册相同的脚本,但这确保它只会被包含一次。

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

我很清楚通过ContentPlaceHolder块或通过“Head.Controls.Add”向 HEAD 块添加内容的各种方法,但这些选项不能解决多次添加相同内容的问题。

是否有现有的方法可以做到这一点,或者我是否必须编写一个类来执行类似于ClientScript.RegisterClientScriptBlock 的操作,除了针对 HEAD 块?

我拼凑了一个用户控件。 标记中根本没有任何内容,因此您只需将新的 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!"")");

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM