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