如何将lambda传递给Razor辅助方法?

我有一个razor助手方法需要接受一个Func ,它将返回一些HTML内容打印出来。 这是我原来的:

 @helper node(string title, Func descriptions) { .... 
@descriptions()
.... } @node("title", new Func(() => { return new HelperResult( @ "desc1" "desc2" ); }))

不幸的是,我的文字永远不会打印出来。 也没有错误。

所以我学习了内联帮助器,并将调用方法更改为:

 @node("title", @ "desc1" "desc2" ) 

但是现在我收到编译错误说

“委托’System.Func’不接受1个参数”。

但我不是在传递任何论点。

因此,如果我将其更改为Func然后使用@descriptions(null)调用它,我会收到以下错误:

“如果没有先将lambda表达式转换为委托或表达式树类型,则不能将lambda表达式用作动态调度操作的参数”

我确定我的某些地方出了问题,但我不确定它是什么。

编辑 :我想我可能已经解决了这个问题,但它引入了一些其他问题。

我做的是在传递给动态方法之前施放lambda。 我猜这就是错误试图说的:

 @node("title", ((Func)(@ "desc1" "desc2" )) 

这有效,它可以正确打印出span标签。 不幸的是,我必须在调用此Func时传入一​​个无用的参数。

现在我遇到的问题是我的真正function不仅仅是写一些跨度。 它更像是这样的:

 @node("title", ((Func)(@ @Helpers.Format(resource.Description,"item") )) 

其中@Helpers.Format是另一个帮助器,资源是页面模型中的(动态)变量。

当然现在代码运行但没有打印出来(在标签内)。 我在我的Format助手函数中放了一个断点,它命中它并且所有参数都被正确设置,所以我不确定它为什么输出不正确。 同样,如果我只是将其更改为resource.Description,那么仍然没有输出。

因为它在这个上下文之外运行良好,我想知道Razor的内联助手不能捕获外部变量吗?

实际上,HelperResult是微软宁愿你没有使用的东西,正如文档所certificate的那样:

公共类HelperResult:命名空间System.Web.WebPages中的IHtmlString

简介:此类型/成员支持.NET Framework基础结构,不能直接在您的代码中使用。

您的问题的一个可能的解决方案可能是将描述函数包装在另一个帮助器中,然后将该帮助器作为方法组传递给您的节点帮助器,如下所示:

 @helper Node(string title, Func descriptions) { 
@descriptions()
} @helper Description() { desc1 desc2 } @Node("title", Description)

在任何情况下,你的第一个想法都不应该工作,因为Func类型的参数实际上等于无参数函数,在这种情况下你需要像这样编写lambda表达式:

 myFunction( () => doSomething) 

所以你的函数调用应该是:

 @node("title", () => @ "desc1" "desc2" ) 

由于这些助手的未来有点可疑 ,我会考虑切换到HtmlHelpers用于html的小片段或用于较大块的Partials 。

 @Test(new Func[]{@hello}) @Test(new Func[]{@hello,@world}) @helper Test(params Func[] results) { foreach (var result in results) { @result(null); } }