簡體   English   中英

如何在輸出之前修改整個 ASP.NET 頁面內容?

[英]How can I modify the entire ASP.NET page content right before it's output?

我有一個頁面,上面有一堆用戶控件。 我希望能夠直接在將在我的代碼中替換的內容中包含“宏”或“占位符”。 這應該無關緊要,但我使用 Ektron 作為我的 CMS。

在將整個呈現的頁面內容發送到客戶端之前,是否有任何我可以掛鈎的頁面事件對整個呈現的頁面內容進行字符串替換?

更新

這是我目前用來完成此操作的代碼:

protected override void Render(HtmlTextWriter writer)
{
    string content = string.Empty;

    using (var stringWriter = new StringWriter())
    using (var htmlWriter = new HtmlTextWriter(stringWriter))
    {
        // render the current page content to our temp writer
        base.Render(htmlWriter);
        htmlWriter.Close();

        // get the content
        content = stringWriter.ToString();
    }

    // replace our placeholders
    string newContent = content.Replace("$placeholder1$", "placeholder1 data").Replace("$placeholder2$", "placeholder2 data");

    // write the new html to the page
    writer.Write(newContent);
}

您是否嘗試過覆蓋渲染方法?

protected override void Render(HtmlTextWriter writer)
{
   StringBuilder htmlString = new StringBuilder(); // this will hold the string
   StringWriter stringWriter = new StringWriter(htmlString);
   HtmlTextWriter tmpWriter = new HtmlTextWriter(stringWriter);
   Page.Render(tmpWriter);
   writer.Flush();

   writer.Write(DoReplaceLogic(htmlString.ToString()););
}

您可以使用兩種方法:

  1. 這類似於已接受的答案。 但我建議覆蓋BasePage 中的 render 方法並從中派生所有模板。

  2. 使用 HttpModule 或 Global.asax 並將過濾器附加到 Response 對象。 對我來說,這更具有美感,因為“過濾器”屬性應該可以幫助您過濾輸出,這正是您想要的!

您是否查看過生命周期中的 PreRender 事件?

在此事件發生之前:

• Page 對象為每個控件和頁面調用EnsureChildControls。

• 每個設置了DataSourceID 屬性的數據綁定控件都調用其DataBind 方法。

• 頁面上的每個控件都會發生 PreRender 事件。 使用該事件對頁面或其控件的內容進行最終更改

我相信這是你可以做這樣的事情的最后一個地方。 下一個事件是SaveStateComplete ,根據文檔,它具有以下行為:

在此事件發生之前,已為頁面和所有控件保存了 ViewState。 此時對頁面或控件的任何更改都將被忽略。 使用此事件執行需要保存視圖狀態但不對控件進行任何更改的任務。

引用來源: https : //www.c-sharpcorner.com/UploadFile/8911c4/page-life-cycle-with-examples-in-Asp-Net/

想到的簡單答案是對“占位符”使用 asp:Literal 控件。 您可以在頁面加載期間設置它們的內容,或者您​​可以連接到 PreRender 事件然后設置它們。

聽起來您可能希望在頁面中包含 HTML 文字,然后您可以簡單地將它們替換為 Page_Load 事件中的適當內容。

這將需要您寫出 HTML 代碼,而不是一些簡單的文本,但聽起來您可能會在其中注入自己的 JavaScript 代碼或類似代碼,這將非常有用。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

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