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

时间:2015-05-26 19:37:07

标签: c# asp.net webforms

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

2 个答案:

答案 0 :(得分:1)

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

Documentation page

但是,我相信你应该使用(单独的?继承?)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都有一个唯一的密钥。

  

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