這裏的「主要問題」我猜:插入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);
}
差不多。我想取html的大塊,插入一些asp.net標記,然後將整個事情傳回到.NET來處理asp.net控件的呈現。 這幾乎就好像我想讓我相信這個字符串我在內存中真的是一個.aspx頁面(沒有代碼隱藏)並告訴.NET「請把它當作一個動態編譯頁面」。 – FirstDivision 2012-04-03 21:53:16
我想這會盡可能地接近我所能得到的。這是我認爲我希望模擬的SharePoint 2010頁面處理模型,儘管以一種更簡單的方式:http://msdn.microsoft.com/en-us/library/ms498550.aspx – FirstDivision 2012-04-09 16:29:13