如何在模板化的剃刀委托中包含更多逻辑?

时间:2014-03-17 09:51:38

标签: c# asp.net-mvc razor

Mr Haacked获取以下扩展方法。

public static class Helpers {
  public static HelperResult RenderSection(this WebPageBase webPage, 
      string name, Func<dynamic, HelperResult> defaultContents) {
    if (webPage.IsSectionDefined(name)) {
      return webPage.RenderSection(name);
    }
    return defaultContents(null);
  }
}

用法如下:

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

非常方便,但我想要做的是在代表中包含一些业务逻辑,如下所示:

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

但无论我如何尝试更改扩展名,我都会在查看页面时遇到编译错误。

我怎样才能做到这一点?

1 个答案:

答案 0 :(得分:0)

大卫福勒让我对Razor的一个非常酷的功能我没有意识到它成为1.0,Templated Razor代表。那是什么?我会让代码说话。

@{
  Func<dynamic, object> b = @<strong>@item</strong>;
}
<span>This sentence is @b("In Bold").</span>

如果你有朋友会使用粗体标签代替强标签,因为它“不是语义”,这可能会派上用场。是的,我正用舌头看着你Damian Smile。我的意思是,这两个词都不是强有力的吗?我离题了。

请注意,生成的委托是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);
            }
        });
    }
}

此List方法接受模板化的Razor委托,因此我们可以这样调用它。

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

<ul>
@items.List(@<li>@item)
</ul>

正如我之前提到的,请注意此方法的参数,@&lt; li&gt; @ item&lt; / li&gt;自动转换为Func&lt; dynamic,HelperResult&gt;这是我们的方法所需要的。

现在这个List方法非常可重用。我们用它来制作漫画书表。

@{
    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>

此功能最初是为支持WebGrid助手方法而实现的,但我相信您会想到其他创造性的方法来利用它。