2012-04-03 68 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