呈现自定义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
来保证它会渲染脚本。
您的方法接受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片段拥有唯一的密钥。
启动脚本由其键和类型唯一标识。具有相同键和类型的脚本被认为是重复的。只能向页面注册一个具有给定类型和密钥对的脚本。尝试注册已注册的脚本不会创建该脚本的副本。