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