ParseControl不支持内联代码块的解决方法?

时间:2011-08-15 10:21:34

标签: c# asp.net inline-code parsecontrol

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

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

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

5 个答案:

答案 0 :(得分:2)

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

一种应该工作但更复杂的方法是依赖VirtualPathProvider提供的UserControl。

然后你可以在理论上把它包装成像ParseControl这样的简单API,但实际上它会编译用户控件。

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

动态语言可以更好地用于这样的事情:)

答案 1 :(得分:1)

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

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

E.g。获取外部数据源,将其传输到一个唯一的文件(如果需要,给它一个GUID名称,或者在时间戳上建立名称,甚至是传入字符串的哈希),然后使用Page.LoadControl(pathToFile),传递文件位置作为参数。

根据字符串的散列命名文件的优点是,如果重复输入,您可以保存重写它以获得完全相同的输入。

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

答案 2 :(得分:1)

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

您还可以使用这个易于使用的razor templating engine来解析和发出HTML:

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

  placeholder.Controls.Add(new LiteralControl(result));

答案 3 :(得分:1)

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

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

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

  

如果解析器遇到代码段(&lt;%...%&gt;,&lt;%= ...%&gt;或&lt;%#   ...%&gt;),它用一个包含特殊控件的代码替换代码片段   码。从ASP.NET的角度来看,没有代码;片段   只是成为一个恰好具有字符串属性的控件   码。这就是我们如何克服无编译页面的限制   不能有代码。

答案 4 :(得分:-1)

试试这个:

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