簡體   English   中英

在/ BODY標記的末尾渲染自定義HTML /腳本

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

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM