呈现自定义HTML/Script结束/BODY标签

本文关键字:结束 BODY 标签 Script 自定义 HTML | 更新日期: 2023-09-27 17:50:46

我有以下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来保证它会渲染脚本。

呈现自定义HTML/Script结束/BODY标签

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

文档页

但是,我认为您应该使用(单独的?继承了?)MasterPage,而不是通过c#注入。它更透明,更容易;)

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

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

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

只要将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片段拥有唯一的密钥。

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