我有以下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
的不同变体,但它们都没有全局工作,也就是说,我发现很多情况下脚本根本无法呈现,所以我已经回归使用{{1}保证它会渲染脚本。
答案 0 :(得分:1)
您的方法接受writer
。您必须使用它来写入流,而不是使用Response
对象。
但是,我相信你应该使用(单独的?继承?)MasterPage,而不是通过C#注入。它更透明,更容易;)
答案 1 :(得分:0)
您可以使用Page.CleintScript.RegisterStartupScript
method将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都有一个唯一的密钥。
启动脚本由其密钥及其类型唯一标识。具有相同密钥和类型的脚本被视为重复。只能在页面中注册一个具有给定类型和密钥对的脚本。尝试注册已注册的脚本不会创建脚本副本。