我在ASP.Net中使用ParseControl方法来呈现来自外部数据源的一些混合HTML和服务器控制代码。
这很好用,但是ParseControl似乎不支持内联脚本块(< %%>),我想知道是否有一个简单的替代或解决方法?这是一个简单的例子(现实世界的实现更复杂):
string externalCodeString = "<div><%= DateTime.Now %></div>";
Control control = ParseControl(externalCodeString);
placeholder.Controls.Add(control);
答案 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)));