2012-04-03 67 views
0

這裏的「主要問題」我猜插入ASP標籤和用戶控件到CMS內容

有(通過的HttpHandler或HTTP模塊)是「.NET辦法」在請求得到很早就和注入標準的asp.net標記,無論是標準控件或用戶/自定義控件的形式,並讓框架將其視爲一個動態編譯的頁面?

更多背景

好了,所以有這個定製CMS,我們使用的是不建立相當複雜的網站偉大的工作。它有一個很好的模板系統,用戶權限,易於安裝等。然而,我們想添加的一個功能是能夠添加動態內容。

在CMS退出並執行「它的事情」後,結果本質上是一個巨大的HTML字符串,它會在響應中發回。渲染引擎包含在處理這個「cms stuff」的類中。目前這發生在標準頁面生命週期中,但沒有理由不能獨立調用。

我已經能夠同時關閉httpHandler和httpModule,但問題是我真正需要的是採取「cms html字符串」,在我自己的.net控件中添加然後該框架採取新的字符串,並從它建立一個控制樹(以及一個視圖狀態等)。

我得到的最接近的是HttpModule,它在PreRequestHandlerExecute過程中爲響應附加了一個過濾器。此過濾器只是尋找用{標籤標記標記替換{{replaceme}}的地方(作爲下面的概念驗證示例)。我認爲這將工作,因爲從我讀過的這是控制樹被創建之前,但所有發生的是asp.net標記寫入頁面(不是由.NET呈現)。

我試過的另一件事是通過HttpHandler完成控制。這個幾乎可以工作(下面也是一個例子)......這裏的問題是,雖然我可以構建自己的控制樹,甚至執行ascx控件,但是沒有地方可以將所有這些東西合併在一起(記住我已經有了一個完整的HTML文檔字符串,我試圖在運行時合併它並將它傳遞給.NET)。

我覺得我很接近,但錯過了一些非常簡單的方式來傳遞最這項工作關到.NET的...

的HttpModule

private void PreRequestHandlerExecute(Object source, EventArgs e) 
    { 
     HttpApplication application = (HttpApplication)source; 
     HttpContext context = application.Context; 

     context.Response.Filter = new PageFilter(context.Response.Filter); 
    } 

過濾器(從SO例子,我認爲)

public override void Write(byte[] buffer, int offset, int count) 
    { 
     string strBuffer = System.Text.UTF8Encoding.UTF8.GetString(buffer, offset, count); 

     // --------------------------------- 
     // Wait for the closing </html> tag 
     // --------------------------------- 
     Regex eof = new Regex("</html>", RegexOptions.IgnoreCase); 

     if (!eof.IsMatch(strBuffer)) 
     { 
      responseHtml.Append(strBuffer); 
     } 
     else 
     { 
      responseHtml.Append(strBuffer); 
      string finalHtml = responseHtml.ToString(); 

      finalHtml = finalHtml.Replace("{{replaceme}}", @"<asp:Label id=""lblMyTest"" runat=""server"" Text=""This is a label that was replaced by my responsefilter"" />"); 

      // Transform the response and write it back out 

      byte[] data = System.Text.UTF8Encoding.UTF8.GetBytes(finalHtml); 

      responseStream.Write(data, 0, data.Length); 
     } 
    } 

測試的HttpHandler

public void ProcessRequest(HttpContext context) 
    { 

     MyBasePage page = new MyBasePage(); 
     Test tpage = (Test)BuildManager.CreateInstanceFromVirtualPath("~/Test.ascx", typeof(Test)); 

     var htmlform = new System.Web.UI.HtmlControls.HtmlForm(); 
     var panel = new Panel(); 

     panel.Controls.Add(new Label() { Text = "Hello World" }); 
     panel.Controls.Add(tpage); 

     htmlform.Controls.Add(panel); 
     page.Controls.Add(htmlform); 
     page.ProcessRequest(context); 
    } 

回答

1

嘗試這樣做可能會遇到很多麻煩。如果我瞭解你,你有一塊HTML來自CMS,並且你想把它轉回到一個控制樹,你可以將其與更多的控件(來自ASP.Net標記)合併,然後生成最終的HTML 。

但這與ASP.Net所做的相反。它使用ASP.Net控件分析標記以生成控件樹,然後從該控件樹中生成HTML。ASP.Net中沒有任何內容解析任意的HTML。我認爲你需要完全重寫.aspx處理程序,複製它的所有解析和樹構建函數。

我會試着找到另一種方式來使用您的CMS來實現這一點。你正在顛覆這個系統,這隻會導致很難維持一團糟。

+0

差不多。我想取html的大塊,插入一些asp.net標記,然後將整個事情傳回到.NET來處理asp.net控件的呈現。 這幾乎就好像我想讓我相信這個字符串我在內存中真的是一個.aspx頁面(沒有代碼隱藏)並告訴.NET「請把它當作一個動態編譯頁面」。 – FirstDivision 2012-04-03 21:53:16

+0

我想這會盡可能地接近我所能得到的。這是我認爲我希望模擬的SharePoint 2010頁面處理模型,儘管以一種更簡單的方式:http://msdn.microsoft.com/en-us/library/ms498550.aspx – FirstDivision 2012-04-09 16:29:13