Вставьте теги ASP и пользовательские элементы управления в контент CMS
Вот "главный вопрос", я думаю:
Существует ли "способ.NET" для получения запроса в самом начале (через HttpHandler или HttpModule) и внедрения стандартной разметки asp.net, либо в виде стандартных элементов управления, либо пользовательских / пользовательских элементов управления, и для обработки структуры это как страница, которую он динамически компилирует?
Больше фона
Итак, есть эта специальная CMS, которую мы используем, которая отлично справляется с созданием довольно сложных сайтов. У него хорошая система шаблонов, пользовательские разрешения, простота установки и т. Д. Однако, одна функция, которую мы хотим добавить, это возможность добавлять динамический контент.
После того, как CMS выходит из строя и делает "свое дело", в результате получается гигантская строка HTML, которая отправляется обратно в ответ. Механизм рендеринга содержится в классе, который обрабатывает этот "материал CMS". Прямо сейчас это происходит в стандартном жизненном цикле страницы, но нет никаких причин, по которым его нельзя вызвать независимо.
Мне удалось сблизиться как с httpHandler, так и с httpModule, но проблема в том, что мне действительно нужно взять "строку hms hms", добавить свои собственные элементы управления.net, а затем заставить инфраструктуру принять новый строка и построить дерево управления из него (вместе с viewstate и т. д.).
Самое близкое, что я получил, было с HttpModule, который во время PreRequestHandlerExecute прикрепил фильтр к ответу. Этот фильтр только искал места для замены {{replaceme}} с разметкой тега label (как подтверждение концепции... пример ниже). Я думал, что это сработает, поскольку из того, что я прочитал, было до того, как было создано дерево элементов управления, но все, что произошло, - это то, что разметка 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. Вы подрываете систему, и это может привести к очень сложному поддержанию беспорядка.