这里的“主要问题”我猜:插入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