Обходной путь для ParseControl не поддерживает встроенные блоки кода? - PullRequest
3 голосов
/ 15 августа 2011

Я использую метод ParseControl в ASP.Net для визуализации некоторого смешанного HTML-кода и управляющего кода сервера, поступающего из внешнего источника данных.

Это работает хорошо, однако ParseControl, похоже, не поддерживает встроенные блоки скриптов (<%%>), и мне интересно, есть ли простая альтернатива или обходной путь для этого? Вот один простой пример (реализация в реальном мире более сложная):

string externalCodeString = "<div><%= DateTime.Now %></div>";
Control control = ParseControl(externalCodeString);
placeholder.Controls.Add(control);

Ответы [ 5 ]

2 голосов
/ 20 августа 2011

ParseControl действительно не поддерживает блоки кода, потому что он никогда не вызывает компиляции.

Один подход, который должен работать, но более сложный, - вместо этого полагаться на UserControl, обслуживаемый VirtualPathProvider.

Затем вы могли бы теоретически обернуть это в простой API, такой как ParseControl, но он фактически скомпилировал бы пользовательский элемент управления.

Вы должны были бы сделать правильное кэширование, чтобы гарантировать, что вы не закончите компиляцию на каждомвызов, который убил бы perf.

Динамические языки работали бы лучше для чего-то вроде этого:)

1 голос
/ 05 сентября 2011

Существует ограничение, что на страницах без компиляции не может быть кода.

http://www.asp.net/learn/whitepapers/ironpython

Новый IronPython, находящийся на ранней стадии, является решением:

Если синтаксический анализатор обнаруживает фрагмент кода (<% ...%>, <% = ...%> или <% # ...%>), он заменяет фрагмент специальным элементом управления, которыйсодержит кодС точки зрения ASP.NET, нет кода;фрагмент просто становится элементом управления, у которого есть строковое свойство с кодом.Вот как мы обойдем ограничение, что на страницах без компиляции не может быть кода.

1 голос
/ 23 августа 2011

Возможно ли переключиться на синтаксис 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));
1 голос
/ 20 августа 2011

Исходя из контекста, приведенного в вашем вопросе, это может сработать - если нет ограничения, которое вы, возможно, еще не упомянули.

Можно ли сначала записать на диск, чтобы вместо него можно было использовать Page.LoadControl?

например. возьмите ваш внешний источник данных, передайте его в уникальный файл (при необходимости присвойте ему имя GUID, или укажите имя на временной отметке или даже в хэше входящей строки), а затем используйте Page.LoadControl(pathToFile), передавая местоположение файла в качестве параметра.

Преимущество присвоения имени файлу на основе хеш-функции строки заключается в том, что вы можете сохранить повторную запись для того же самого ввода, если он когда-либо повторяется.

В какой-то момент вам понадобится процесс очистки, который удалит все неиспользуемые файлы.

0 голосов
/ 15 августа 2011

Попробуйте это:

placeholder.Controls.Add(new LiteralControl(String.Format("<div>{0}</div>", DateTime.Now)));
...