[英]How can I include more logic within a templated razor delegate?
请采用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>
但是,无论我如何尝试更改扩展名,在查看页面时都会出现编译错误。
我该如何实现?
David Fowler让我了解了Razor的一个非常酷的功能,但我还没有意识到它已成为1.0,Templated Razor Delegates。 那是什么? 我让代码讲。
@{
Func<dynamic, object> b = @<strong>@item</strong>;
}
<span>This sentence is @b("In Bold").</span>
如果您有朋友愿意使用粗体标签而不是强标签,因为这是“非语义”的,那可能会派上用场。 是的,我用舌头看着你达米安微笑。 我的意思是,两个词都不表示有力吗? 我离题了。
请注意,生成的委托是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>
如前所述,请注意,此方法的参数@ <li> @item </ li>会自动转换为Func <dynamic,HelperResult>,这是我们方法所需要的。
现在,此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助手方法,但是我敢肯定,您会想到其他创造性的方法来利用它。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.