【问题标题】:Using PHP-like functions in T4 templates在 T4 模板中使用类 PHP 函数
【发布时间】:2018-03-27 17:47:49
【问题描述】:

在 PHP 中可以有一个函数,它的主体从渲染模式切换到代码模式,如下所示:

<?php
 function renderA(a){
   if(a.label){
      ?><label></label><?php
   } else {
      ?><span></span><?php
   }
 }
?>

这在 T4 中也可以吗? 我的谷歌搜索把我带到了这里:Is there any way to have functions in basic T4 templates?

但是这个函数定义似乎不允许这样做。

或者至少,它并不明显......

我知道这段 PHP 代码不是很漂亮的代码,但是当您必须在循环中多次调用 renderA 来渲染某些东西时,它会派上用场。我认为 ASP.MVC-razor 也有类似的东西(https://stackoverflow.com/a/6532107/2173353),所以我希望 T4 也能以某种方式支持它......

【问题讨论】:

  • 是的,可以通过使用 &lt;# ... #&gt; 块标记来确定代码范围(请参阅实体框架从 EDMX 生成的 T4 模板作为示例)。您到底想用 T4 模板尝试什么?
  • @TetsuyaYamamoto 我只想创建一个包含 C# 代码和 HTML 渲染的函数,如上面的 PHP 示例所示。到目前为止,我只看到了纯 C# 代码的函数(其中没有进行 html 渲染)。您是否有您提到的这个 E.F. 示例的链接?
  • @user2173353 渲染出来的代码还是C#代码,不能神奇地制作PHP风格的函数。
  • @DavidG 我不知道我是否理解你的评论,但我知道我应该在函数内部用 C# 编写代码而不是 PHP 代码,只是我想要代码/html 切换能力PHP 有。类似于此处介绍的 ASP.MVC 剃刀语法:stackoverflow.com/a/6532107/2173353。 Razor 确实支持这一点,它是 C# 代码。

标签: c# templates t4


【解决方案1】:

好的。 我在这里找到了答案: How to create a method that encapsulates the T4 template text section?

似乎&lt;# #&gt;&lt;#+ #&gt; 的特殊组合可以解决问题。

<#+
public void RenderA(MyClass a){
   if(a.label != null){
      #><label><#= a.text #></label><#+
   } else {
      #><span><#= a.text #></span><#+
   }
}
#>

基本上,您像往常一样使用&lt;#= #&gt; 进行字符串插值,使用&lt;#+ #&gt; 继续处理函数体。

链接问题中还有另一种选择,它使用内联 lambda 声明 (https://stackoverflow.com/a/23840134/2173353)。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-06-20
    • 2016-11-01
    • 1970-01-01
    • 2013-01-09
    • 2018-08-05
    相关资源
    最近更新 更多