繁体   English   中英

在/ BODY标记的末尾渲染自定义HTML /脚本

[英]Render custom HTML/Script at end of /BODY tag

我有以下BasePage类,该站点上的所有页面都直接或通过子类继承。 我覆盖了Render方法,因此它在站点的每个页面上输出一个脚本。 当前代码在结束/ HTML标记之后编写脚本。

public class BasePage : Page
{
....
    protected override void Render(System.Web.UI.HtmlTextWriter writer)
    {
            base.Render(writer);
            Response.Write("<Script>custom</script>");
    }
}

子类示例:

public class AdminPage : BasePage {}

我如何在关闭/ BODY标记或/ FORM标记之前编写脚本? 我尝试了RegisterStartUpScript不同变体,但是它们都无法全局运行,即,我发现很多情况下脚本根本无法渲染,因此我不得不使用Response.Write来保证它可以渲染脚本。

您的方法接受writer 您必须使用它来写入流,而不使用Response对象。

文档页面

但是,我相信您应该使用(单独的?继承的?)MasterPage来做到这一点,而不是通过C#进行注入。 它更加透明,而且非常容易;)

您可以使用Page.CleintScript.RegisterStartupScript方法将JavaScript放在页面的Page.CleintScript.RegisterStartupScript 此方法将JavaScript放在form标签的末尾。

protected void Page_Load(object sender, EventArgs e)
{
    this.Page.ClientScript.RegisterStartupScript(this.Page.GetType(), 
        "MyJavaScript", "custom", true);
}

第一个参数必须是当前页面的类型(请注意,有时它会失败)。 第二个是可在页面上唯一标识此脚本的键(因此您可以添加/更新多个脚本)。 第三个参数是包含您的代码的字符串(您可以使用StringBuilder该部分)。 最后一个参数(如果为true)使框架包含script标记,因此您不必将它们放入代码字符串中。

只要将System.Web.UI.Page对象传递给基类中定义的方法,它就可以在基类中正常工作。

// In base class
protected void LoadJavaScript(System.Web.UI.Page page)
{
    string key = "MyJavaScript";
    if (page.ClientScript.IsStartupScriptRegistered(key))
    {
        StringBuilder sb = new StringBuilder();

        sb.AppendLine("alert('hello');");

        page.ClientScript.RegisterStartupScript(page.GetType(), 
            key, sb.ToString(), true);
    }
}

// In subclass
protected void Page_Load(object sender, EventArgs e)
{
    this.LoadJavaScript(this.Page);
}

根据MSDN ,您还需要确保每个注册的JavaScript都有唯一的密钥。

启动脚本由其键和类型唯一标识。 具有相同键和类型的脚本被视为重复脚本。 页面上只能注册具有给定类型和密钥对的一个脚本。 尝试注册已注册的脚本不会创建该脚本的副本。

暂无
暂无

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

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