3

我在 ASP.Net 中使用 ParseControl 方法来呈现一些来自外部数据源的混合 HTML 和服务器控制代码。

这运行良好,但是 ParseControl 似乎不支持内联脚本块 (<% %>),我想知道是否有一个简单的替代方案或解决方法?这是一个简单的例子(现实世界的实现更复杂):

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

5 回答 5

2

ParseControl 确实不支持代码块,因为它永远不会导致任何编译。

一种应该有效但更复杂的方法是依赖于由 VirtualPathProvider 提供的 UserControl。

然后,理论上您可以将其包装到像 ParseControl 这样的简单 API 中,但它实际上会编译用户控件。

您必须进行适当的缓存,以确保您不会在每次调用时都编译,这会杀死性能。

动态语言对于这样的事情会更好:)

于 2011-08-19T20:00:47.843 回答
1

有一个限制,即非编译页面不能有代码。

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

处于早期阶段的新 IronPython 是一个解决方案:

如果解析器遇到代码片段(<% ... %>、<%= ... %> 或 <%# ... %>),它会将片段替换为保存代码的特殊控件。从 ASP.NET 的角度来看,没有代码;该片段只是成为一个控件,恰好具有代码的字符串属性。这就是我们绕过非编译页面不能有代码的限制的方法。

于 2011-09-05T10:09:07.010 回答
1

根据您问题中给出的上下文,这可能有效 - 除非您可能尚未提及限制。

是否可以先写入磁盘,以便您可以使用Page.LoadControl

例如,获取您的外部数据源,将其流式传输到一个唯一文件(如果需要,给它一个 GUID 名称,或者将名称基于时间戳,甚至是传入字符串的哈希),然后使用Page.LoadControl(pathToFile),将文件位置作为范围。

根据字符串的哈希命名文件的好处是,如果重复输入,您可以保存为完全相同的输入重新编写它。

在某些时候,您将需要一个清理过程来删除任何未使用的文件。

于 2011-08-19T20:05:27.900 回答
1

您是否可以为内联代码切换到 Razor 语法?如果是,那么您可以使用 Razor View Engine 来解析它(Hosting the Razor Engine for Templating in Non-Web Applications)

您还可以使用这个易于使用的razor 模板引擎来解析和发出 HTML:

  string template = "<div>@DateTime.Now</div>";
  string result = Razor.Parse(template, new { Prop1 = "someValue" });

  placeholder.Controls.Add(new LiteralControl(result));
于 2011-08-22T21:40:50.450 回答
-1

试试这个:

placeholder.Controls.Add(new LiteralControl(String.Format("<div>{0}</div>", DateTime.Now)));
于 2011-08-15T15:06:31.203 回答