【问题标题】:Generate Razor and Webforms markup from one file从一个文件生成 Razor 和 Webforms 标记
【发布时间】:2011-12-04 02:25:08
【问题描述】:

在我们的项目中,我们偶然发现了以下问题:我们需要为我们的开发人员提供两种母版页(基于 Razor 和基于 Webforms),每一种都将生成完全相同的 HTML 输出强>。

我们最初的想法是使用 T4 模板引擎并且只有一个模板会生成 2 个文件:*.master 和 *.cshtml 其中,例如 @using Razor 指令将对应于 <%@ Import ... webforms 语句。

关键的想法是 HTML 部分不应该重复所以很明显我们不能使用Generating more than one output file from a template 或How to use T4 to generate two files at the same time from one template? 中推荐的方法,因为所有静态内容(纯 HTML)都在这样一个案例将被重复。

显然我可以编写我的自定义 T4 生成器,但它会很复杂,因为页面上有太多指令(例如 "<%=",它将对应于 Razor 中的 "@")。

关于如何使用任何可用的模板引擎完成此任务的任何其他想法?

【问题讨论】:

    标签: asp.net webforms razor t4


    【解决方案1】:

    经过一些头脑风暴自定义模板 (http://www.olegsych.com/2008/09/t4-tutorial-creating-reusable-code-generation-templates/) 成功了。

    这个想法是有两个模板:一个模板用于保存 HTML 和条件渲染逻辑,另一个模板用于以不同的参数运行第一个模板两次。

    模板运行器可能如下所示:

    <#@ include file="GenericMasterPageTemplate.tt" #>
    <#
    GenericMasterPageTemplate genericMasterPageTemplate = new  GenericMasterPageTemplate();
    genericMasterPageTemplate._viewEngine = "Razor";
    genericMasterPageTemplate.Output.File = @"PATH_TO_OUTPUT_RAZOR_TEMPLATE";
    genericMasterPageTemplate.Render();
    
    genericMasterPageTemplate._viewEngine = "Webforms";
    genericMasterPageTemplate.Output.File = @"PATH_TO_OUTPUT_WEBFORMS_TEMPLATE";
    genericMasterPageTemplate.Render();
    #>
    

    显然,第一个模板中的条件逻辑将分析 _viewEngine 参数的值并适当地呈现必要的指令。

    【讨论】:

    • 如果这对你有用,我觉得没问题。如果您将所有生成代码放在 T4 文件中的一个函数中并调用两次,则可能您可以拥有一个 TT 文件,但由于我从不将模板呈现给多个文件,因此我不能 100% 确定这种方法是否有效。
    • 感谢您的评论。我的想法是,拥有一个可以解释不同输入参数的模板和另一个将设置和运行模板的文件在职责分离方面是一件好事。除了考虑 T4 内在函数之外,我认为从技术上讲,将可重用模板与运行它的参数和代码结合起来是不可能的。也许我对这一点有误,但这是一个不同的问题。
    • 在不知道模板外观的详细信息的情况下,我不能说它是否不可能,但你找到你喜欢的解决方案是件好事。
    猜你喜欢
    • 2011-10-28
    • 1970-01-01
    • 2018-01-29
    • 2019-01-05
    • 2021-06-22
    • 1970-01-01
    • 2023-01-30
    • 2014-07-01
    • 2015-01-19
    相关资源
    最近更新 更多