2012-04-03 13 views
0

Hier sind die „zentrale Frage“ Ich denke:Insert ASP-Tags und Benutzersteuerelemente in CMS Content

Gibt es einen „.NET Weg“ zu einem Antrag zu bekommen sehr früh (entweder über Httphandler oder Httpmodule) und Standard-asp.net-Markup, entweder in Form von Standard-Steuerelementen oder Benutzer-/benutzerdefinierten Steuerelementen, injizieren und behandeln das Framework wie eine Seite, die es dynamisch kompiliert?

Mehr Hintergrund

Ok, also gibt es dieses kundenspezifische CMS verwenden wir, dass hat eine große Aufgabe der ziemlich komplizierte Baustellen. Es hat ein schönes Templating-System, Benutzerberechtigungen, einfach zu installieren, usw. Eine Funktion, die wir hinzufügen möchten, ist jedoch in der Lage, dynamischen Inhalt hinzuzufügen.

Nachdem das CMS ausgeht und "seine Sache" macht, ist das Ergebnis im Wesentlichen eine riesige HTML-Zeichenfolge, die in der Antwort zurückgesendet wird. Die Rendering-Engine ist in einer Klasse enthalten, die dieses "cms-Zeug" verarbeitet. Momentan passiert dies in einem Standard-Seitenlebenszyklus, aber es gibt keinen Grund, warum es nicht unabhängig aufgerufen werden kann.

Ich habe in der Lage zu nahe kommt sowohl mit einem Httphandler und httpmodule, aber das Problem ist, dass das, was ich wirklich das „cms html string“ nehmen muß, fügen Sie in meinen eigenen .net Kontrollen, und dann haben Das Framework nimmt diese neue Zeichenkette und erstellt daraus einen Kontrollbaum (zusammen mit einem Viewstate, etc).

Am nächsten kam ich mit dem HttpModule, das während PreRequestHandlerExecute einen Filter an die Antwort anschloss. Dieser Filter hat nur nach Stellen gesucht, die {{replaceme}} durch ein Label-Tag-Markup ersetzen sollen (als Proof-of-Concept-Beispiel unten). Ich dachte, das würde funktionieren, da das, was ich gelesen hatte, das war, bevor der Kontrollbaum erstellt wurde, aber alles, was passierte, war, dass das asp.net-Markup auf die Seite geschrieben wurde (nicht von .NET gerendert).

Eine andere Sache, die ich ausprobiert habe, ist vollständige Kontrolle über einen HttpHandler zu nehmen. Dieses hat fast funktioniert auch (auch ein Beispiel unten) ... das Problem hier ist, dass, während ich meinen eigenen Kontrollbaum bauen kann, und sogar ein ASCX-Steuerelement ausführen, gibt es keinen Platz, alle diese Dinge zusammen zu verschmelzen (nicht vergessen) Ich habe bereits eine ganze HTML-Dokument-Zeichenfolge, ich versuche, es zur Laufzeit zusammenzuführen und es an .NET zu übergeben.

Ich fühle mich wie ich bin ganz in der Nähe, aber einige sehr einfache Möglichkeit, fehlt den meisten dieser weg, um .NET zu passieren ...

Httpmodule

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

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

Filter (von SO Beispiel glaube ich)

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); 
     } 
    } 

Das Testhttphandler

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); 
    } 

Antwort

1

Möglicherweise haben Sie eine Menge Mühe, dies zu versuchen. Wenn ich Sie verstehe, haben Sie einen Teil des HTML, der aus dem CMS kommt, und Sie möchten das zurück in eine Kontrollstruktur drehen, die Sie mit mehr Steuerelementen (aus ASP.Net-Markup) zusammenführen und dann das endgültige HTML generieren können .

Aber das ist das Gegenteil von dem, was ASP.Net tut. Es analysiert Markup mit ASP.Net-Steuerelementen, um eine Steuerelementstruktur zu generieren, und generiert dann HTML aus dieser Steuerelementstruktur.Nichts in ASP.Net analysiert beliebiges HTML. Ich denke, Sie müssten den ASPX-Handler vollständig neu schreiben und alle seine Analyse- und Baumerstellungsfunktionen duplizieren.

Ich würde versuchen, einen anderen Weg zu finden, dies mit Ihrem CMS zu implementieren. Sie untergraben das System, und das könnte nur zu einer sehr schwer zu haltenden Unordnung führen.

+0

Fast. Ich möchte den Brocken von HTML nehmen, etwas asp.net Markup einfügen und dann das ganze Ding zurück zu .NET übergeben, um das rendering der asp.net Kontrollen zu behandeln. Es ist fast so, als ob ich glauben möchte, dass diese Zeichenfolge, die ich im Speicher habe, wirklich eine ASPX-Seite (ohne Code-Behind) ist und .NET "bitte behandle das wie eine dynamisch kompilierte Seite". – FirstDivision

+0

Ich denke, das wird so nah wie möglich kommen. Dies ist das SharePoint 2010-Seitenverarbeitungsmodell, von dem ich gehofft habe, es nachzuahmen, allerdings auf eine viel einfachere Art und Weise: http://msdn.microsoft.com/en-us/library/ms498550.aspx – FirstDivision