Обходной путь для ParseControl не поддерживает блоки встроенного кода?
Я использую метод ParseControl в ASP.Net для визуализации смешанного HTML-кода и кода управления сервером, который поступает из внешнего источника данных.
Это работает хорошо, однако ParseControl, похоже, не поддерживает встроенные блоки скриптов (<%%>), и мне интересно, есть ли простая альтернатива или обходной путь для этого? Вот один простой пример (реализация в реальном мире более сложная):
string externalCodeString = "<div><%= DateTime.Now %></div>";
Control control = ParseControl(externalCodeString);
placeholder.Controls.Add(control);
5 ответов
ParseControl действительно не поддерживает блоки кода, потому что он никогда не вызывает компиляции.
Один подход, который должен работать, но является более сложным, состоит в том, чтобы вместо этого полагаться на UserControl, обслуживаемый VirtualPathProvider.
Затем можно теоретически обернуть это в простой API, такой как ParseControl, но он фактически скомпилирует пользовательский элемент управления.
Вам нужно было бы сделать правильное кэширование, чтобы не компилировать каждый вызов, что убило бы perf.
Динамические языки будут работать лучше для чего-то вроде этого:)
Исходя из контекста, приведенного в вашем вопросе, это может сработать - если нет ограничения, о котором вы еще не упомянули.
Можно ли сначала записать на диск, чтобы вы могли использовать Page.LoadControl
вместо?
Например, возьмите ваш внешний источник данных, передайте его в уникальный файл (присвойте ему имя GUID, если вам нужно, или основывайте имя на временной отметке или даже хэше входящей строки), а затем используйте Page.LoadControl(pathToFile)
, передавая местоположение файла в качестве параметра.
Преимущество присвоения имени файлу на основе хеша строки заключается в том, что вы можете сохранить перезаписать его для того же самого ввода, если он когда-либо повторяется.
В какой-то момент вам понадобится процесс очистки, который удаляет все неиспользуемые файлы.
Можно ли переключиться на синтаксис Razor для встроенного кода? Если да, то вы можете использовать Razor View Engine для его анализа (размещение Razor Engine для шаблонов в не-веб-приложениях).
Вы также можете использовать этот простой в использовании шаблонизатор для анализа и выдачи HTML:
string template = "<div>@DateTime.Now</div>";
string result = Razor.Parse(template, new { Prop1 = "someValue" });
placeholder.Controls.Add(new LiteralControl(result));
Существует ограничение, что на страницах без компиляции не может быть кода.
http://www.asp.net/learn/whitepapers/ironpython
Новый IronPython, который находится на ранней стадии, является решением:
Если синтаксический анализатор обнаруживает фрагмент кода (<%...%>, <% =...%> или <% #...%>), он заменяет фрагмент специальным элементом управления, который содержит код. С точки зрения ASP.NET, нет кода; фрагмент просто становится элементом управления, у которого есть строковое свойство с кодом. Вот как мы обойдем ограничение, что на страницах без компиляции не может быть кода.
Попробуйте это:
placeholder.Controls.Add(new LiteralControl(String.Format("<div>{0}</div>", DateTime.Now)));