[英]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.