2013-07-30 86 views
0

爲了修改HTML輸出,在MasterPage的代碼隱藏中使用CsQuery的「框架」代碼是什麼?我需要能夠修改HTML的<body>中的所有內容嗎?在MasterPage代碼隱藏中使用CsQuery來修改HTML輸出?

我希望能夠使用CsQuery來修改動態數據網站的HTML輸出,而不用重寫/搞亂默認代碼。

只是尋找特定於MasterPage代碼隱藏的示例代碼?謝謝。

回答

1

CsQuery項目中有一個示例顯示如何在CsQuery.WebFormsApp項目中執行此操作(我只是確信它正常工作!)。

使用的核心看起來像這樣。您必須覆蓋繼承Page一類Render方法,並在ASPX頁面使用,而不是Page作爲基類的代碼隱藏:

public class CsQueryPage: System.Web.UI.Page 
{ 
    public CQ Doc { get; protected set; } 

    protected override void Render(System.Web.UI.HtmlTextWriter writer) 
    { 
     // most of the work is done for you with the 
     // `CsQuery.WebForms.CreateFromRender` method 

     var csqContext = WebForms.CreateFromRender(this, base.Render, writer); 

     // if you are using update panels, this lets you also manipulate that 
     // HTML, otherwise you don't need the IsAsync part 

     if (csqContext.IsAsync) 
     { 
      foreach (var item in csqContext.AsyncPostbackData) { 
       Cq_RenderUpdatePanel(item.Dom,item.ID); 
      } 
     } 
     else 
     { 
      Doc = csqContext.Dom; 
      Cq_Render(); 
     } 

     // writes the altered content to the base HtmlTextWriter 

     csqContext.Render(); 
    } 

    protected virtual void Cq_Render() 
    { } 

    protected virtual void Cq_RenderUpdatePanel(CQ doc, string updatePanelId) 
    { } 
} 

兩個虛擬方法,在那裏你可以改變DOM,它被填充在CsQueryPage對象的Doc屬性中 - 在這裏將它們保留爲未實現的意圖是每個繼承了CsQueryPage的aspx頁都可以選擇性地覆蓋它們並對DOM進行更改。

要在實踐中看到這是如何工作的,只需從github下拉CsQuery代碼並運行示例。

同樣的技術可用於UserControl,這也在示例中顯示。我實際上沒有演示如何使用MasterPage來做,但它非常相似 - MasterPage來自UserControl,您只是覆蓋它的Render方法與其他情況相同。

+0

感謝https://github.com/jamietre/CsQuery/blob/master/examples/CsQuery.WebFormsApp/CsQuery.WebFormsApp/CsQueryPage/CsQueryUserControl.cs是我應該看過的。值得一問,因爲我沒有意識到我需要UpdatePanels的額外代碼 - DynamicData項目使用了哪些額外的代碼(雖然在我的情況下目前是EnablePartialRendering =「false」)。 –

+0

這實際上是你問的一件好事,因爲那個很長時間沒有碰到的例子有一些錯誤。是的 - 更新面板需要特殊處理,只有實際在面板中的HTML部分才能通過控件傳遞,並且每個都必須單獨處理。 –