How to pass in a lambda to a Razor helper method?

2019-08-06 20:30发布

我有一个需要采取的剃刀helper方法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表达式作为参数传递给一个动态分派操作,而不首先将其浇铸到一个委托或表达式树类型”

我敢肯定,我有什么不对的地方,但我不知道它是什么。

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

我所做的就是突入动态方法之前投的拉姆达。 我想这就是错误想说:

@node("title",                     
              ((Func<dynamic, HelperResult>)(@<text>
              <span>"desc1"</span>
              <span>"desc2"</span>
              </text>))

这一工程,并打印出span正确的标签。 不幸的是我有调用此当一个无用的参数来传递Func

现在我有问题是我真正的功能做更多的不仅仅是写一些跨度。 它更像是这样的:

@node("title",                     
              ((Func<dynamic, HelperResult>)(@<text>
              <span>@Helpers.Format(resource.Description,"item")</span>
              </text>))

@Helpers.Format是另一个助手和资源是从页面模型(动态)变量。

当然,现在的代码运行,但没有被打印出来(内侧<span>标记)。 我把我的断点内部Format的辅助功能,它击中它和所有的参数设置是否正确,所以我不知道为什么它不会正确输出。 同样的,如果我只是将其更改为resource.Description再没有什么仍然得到输出。

由于它的工作原理以及这种背景之外,我不知道它Razor的直列助手没有捕捉到外部变量?

Answer 1:

其实HelperResult东西微软宁愿你没有用,就证明文件:

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

摘要:此类型/成员支持.NET Framework基础结构,不适合直接在代码中使用。

一种可能解决问题的方法可能是包装你描述函数在另一个助手然后该助手作为传递方法组到您的节点帮手,这样的:

@helper Node(string title, Func<HelperResult> descriptions)
{
    <div>@descriptions()</div>
}

@helper Description() {
    <span>desc1</span>
    <span>desc2</span>
}

@Node("title", Description)

在任何情况下,你的第一想法应该不行,因为类型的函数功能的参数其实等于参数的功能,在这种情况下,你需要编写lambda表达式是这样的:

myFunction( () => doSomething)

所以,你的函数调用将是:

@node("title", () =>                    
              @<text>
              <span>"desc1"</span>
              <span>"desc2"</span>
              </text>)

由于这些佣工的未来是有点可疑 ,虽然,我会考虑切换到任何HtmlHelpers对HTML的小片段或者局部模板的更大的块。



Answer 2:

@Test(new Func<object, HelperResult>[]{@<text>hello</text>})

@Test(new Func<object, HelperResult>[]{@<text>hello</text>,@<text>world</text>})


@helper Test(params Func<object, HelperResult>[] results)
{
    foreach (var result in results)   
    {
        @result(null);
    }
}


文章来源: How to pass in a lambda to a Razor helper method?