【问题标题】:Workaround for ParseControl not supporting inline code blocks?ParseControl 不支持内联代码块的解决方法?
【发布时间】:2011-08-15 10:21:33
【问题描述】:

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

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

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

【问题讨论】:

  • 当您只输出一个带有日期的 div 时,为什么要使用 ParseControl?实例更复杂吗?
  • 是的,要复杂得多:)
  • 您能否扩展您的问题并提供更多背景信息?

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


【解决方案1】:

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

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

理论上,您可以将其封装到 ParseControl 之类的简单 API 中,但它实际上会编译用户控件。

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

动态语言更适合这样的事情:)

【讨论】:

    【解决方案2】:

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

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

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

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

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

    【讨论】:

      【解决方案3】:

      您是否可以为内联代码切换到 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));
      

      【讨论】:

      • 脚本已经采用 ASP.Net/C# 语法,但是不错的替代方案,谢谢。
      【解决方案4】:

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

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

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

      如果解析器遇到代码 sn-p (, , or ),它将 sn-p 替换为一个特殊的控件,该控件包含 代码。从 ASP.NET 的角度来看,没有代码; sn-p 只是变成了一个恰好有一个字符串属性的控件 代码。这就是我们如何绕过禁止编译页面的限制 不能有代码。

      【讨论】:

        【解决方案5】:

        试试这个:

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

        【讨论】:

        • 代码来自外部数据源,因此要求代码是内联的(当然如果可能的话)。我已经考虑过使用上面的字符串替换,但是要替换的可能变量的数量会很大,因此无法维护。
        • 我很困惑...您的示例如何满足内联编码的要求?该代码是在脚本块中还是什么?
        • 是的,在来自外部源的字符串中会有几个 ASP.Net 脚本块。抱歉,如果我使用了错误的术语,我应该更新 Q 吗?
        猜你喜欢
        • 2013-07-24
        • 2020-10-02
        • 2023-02-20
        • 2022-01-23
        • 2010-12-07
        • 2014-12-13
        • 1970-01-01
        • 1970-01-01
        • 2020-05-19
        相关资源
        最近更新 更多