C# 如何在模板化的razor委托中包含更多逻辑?

C# 如何在模板化的razor委托中包含更多逻辑?,c#,asp.net-mvc,razor,C#,Asp.net Mvc,Razor,从中获取以下扩展方法 公共静态类帮助程序{ public static HelperResult RenderSection(此网页库网页, 字符串名称,Func defaultContents){ if(网页.已定义分区(名称)){ 返回网页。RenderSection(名称); } 返回defaultContents(空); } } 用法如下: <footer> @this.RenderSection("Footer", @<span>This is the d

从中获取以下扩展方法

公共静态类帮助程序{
public static HelperResult RenderSection(此网页库网页,
字符串名称,Func defaultContents){
if(网页.已定义分区(名称)){
返回网页。RenderSection(名称);
}
返回defaultContents(空);
}
}
用法如下:

<footer>
  @this.RenderSection("Footer", @<span>This is the default!</span>)
</footer>

@this.RenderSection(“Footer”,@这是默认值!)
非常方便,但我想做的是在代理中包含一些业务逻辑,例如:

<footer>
  @this.RenderSection("Footer", @<span>
               This @if (condition) {  
                        <label>is the</label> 
                      } else {  
                        <label> default!</label> 
                      } 
              </span>)
</footer>

@此.RenderSection(“页脚”@
这个@if(条件){
是
}否则{
违约
} 
)
但无论我如何尝试更改扩展名,在查看页面时都会出现编译错误


我怎样才能做到这一点呢?

大卫·福勒(David Fowler)让我看到了Razor的一个非常酷的功能,我还没有意识到它已经变成了1.0版的模板化Razor。那是什么?我会让密码来说话

@{
  Func<dynamic, object> b = @<strong>@item</strong>;
}
<span>This sentence is @b("In Bold").</span>
@{
Func b=@@项目;
}
这句话是@b(“粗体”)。
如果你有朋友会支持你使用粗体标记而不是强标记,因为它是“非语义的”,那么这可能会派上用场。是的,我看着你咧嘴微笑。我是说,这两个词不是都意味着有力吗?我离题了

请注意,生成的委托是Func。另外,@item参数是一个特殊的魔法参数。这些委托只允许使用一个这样的参数,但模板可以根据需要多次调用该参数

我展示的例子非常简单。我知道你在想什么。为什么不用助手呢?给我举一个例子,说明这一点非常有用。好的,你明白了

假设我编写了这个非常酷的HTML助手方法来生成任何类型的列表

public static class RazorExtensions {
    public static HelperResult List<T>(this IEnumerable<T> items, 
      Func<T, HelperResult> template) {
        return new HelperResult(writer => {
            foreach (var item in items) {
                template(item).WriteTo(writer);
            }
        });
    }
}
公共静态类RazorExtensions{
public static HelperResult列表(此列表为IEnumerable items,
Func(模板){
返回新的HelperResult(writer=>{
foreach(项目中的var项目){
模板(项目).WriteTo(编写器);
}
});
}
}
这个List方法接受模板化的Razor委托,所以我们可以这样调用它

@{
  var items = new[] { "one", "two", "three" };
}

<ul>
@items.List(@<li>@item)
</ul>
@{
变量项=新[]{“一”、“二”、“三”};
}
    @items.List(@
  • @item)
如前所述,请注意,此方法的参数@
  • @item
  • 会自动转换为Func,这是我们的方法所需要的

    现在这个列表方法是非常可重用的。让我们使用它生成一个漫画书表

    @{
        var comics = new[] { 
            new ComicBook {Title = "Groo", Publisher = "Dark Horse Comics"},
            new ComicBook {Title = "Spiderman", Publisher = "Marvel"}
        };
    }
    
    <table>
    @comics.List(
      @<tr>
        <td>@item.Title
        <td>@item.Publisher
      </tr>)
    </table>
    
    @{
    var comics=new[]{
    新漫画书{Title=“Groo”,Publisher=“黑马漫画”},
    新漫画书{Title=“蜘蛛侠”,Publisher=“惊奇漫画”}
    };
    }
    @漫画。列表(
    @
    @项目.标题
    @项目.发布者
    )
    
    此功能最初是为了支持WebGrid助手方法而实现的,但我相信您会想到其他创造性的方法来利用它。

    属性:此答案来自。
    @{
        var comics = new[] { 
            new ComicBook {Title = "Groo", Publisher = "Dark Horse Comics"},
            new ComicBook {Title = "Spiderman", Publisher = "Marvel"}
        };
    }
    
    <table>
    @comics.List(
      @<tr>
        <td>@item.Title
        <td>@item.Publisher
      </tr>)
    </table>