我有一个剃须刀辅助方法,需要传入一个Func<>
,该方法将返回一些HTML内容以打印出来。这是我最初的代码:
@helper node(string title, Func<HelperResult> descriptions)
{
....
<div>@descriptions()</div>
....
}
@node("title",
new Func<HelperResult>(() =>
{
return new HelperResult(
@<text>
<span>"desc1"</span>
<span>"desc2"</span>
</text>);
}))
遗憾的是,我的文本从未被打印出来,也没有任何错误提示。
因此,我了解了内联助手,并将调用方法更改为:
@node("title",
@<text>
<span>"desc1"</span>
<span>"desc2"</span>
</text>)
然而,现在我遇到了编译错误,显示:
"委托“System.Func”不接受1个参数"。
但是我没有传递任何参数。
所以,如果我把它改成Func<object,HelperResult>
,然后使用@descriptions(null)
调用它,我会得到以下错误提示:
"不能将 lambda 表达式用作动态分派操作的参数,而不先将其转换为委托或表达式树类型"
我确定我哪里做错了,但我不确定是哪里。
编辑: 我认为我可能解决了那个问题,但这引入了一些其他问题。
我所做的是在传递给动态方法之前对 lambda 进行强制转换。我想这就是错误试图说的:
@node("title",
((Func<dynamic, HelperResult>)(@<text>
<span>"desc1"</span>
<span>"desc2"</span>
</text>))
那个函数运行得很好,能正确地打印出标签。不幸的是,在调用这个Func
时,我必须传递一个无用的参数。
现在我的问题是,我的真正函数不仅仅是写一些标签那么简单,而更像这样:
@node("title",
((Func<dynamic, HelperResult>)(@<text>
<span>@Helpers.Format(resource.Description,"item")</span>
</text>))
@Helpers.Format
是另一个辅助函数,而 resource 是页面模型中的(动态)变量。
当然,现在代码运行了,但是什么也没有被打印出来(在 <span>
标签内)。我在我的 Format
辅助函数内设置了断点,它被触发且所有参数都正确设置,所以我不确定为什么它不能正确输出。同样,如果我只是将代码更改为
resource.Description,
那么仍然没有任何输出。
由于它在此上下文之外工作得很好,我想知道 Razor 的内联辅助程序是否无法捕获外部变量?
例如,这使我们可以强大而美观地直接向库添加Razor代码:
public void Add(Func<object, HelperResult> html) { Add(html.ToString()); }
用户从未看到这些函数,他们只知道像魔术一样,他们可以在链式调用中调用somecontrol.Add(@<div><b>howdy</b></div>)。
该用例适用于流体类型库。 - Nicholas Petersen.Template(@<text>@item.Blah<text>)
,如果这让你感到放心的话。你有关于这些“MVC内联模板”的好文档吗?变化很多,搜索结果却与此无关。它们似乎很强大,我也想更多地使用它们。 - AaronLS