繁体   English   中英

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

[英]How to pass in a lambda to a Razor helper method?

我有一个剃须刀助手方法需要接受一个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表达式用作动态调度操作的参数”

我确定我在某处出了点问题,但我不确定它到底是什么。

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

我做的是在传递动态方法之前施放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的内联助手不能捕获外部变量吗?

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

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

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

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

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

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

@Node("title", Description)

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

myFunction( () => doSomething)

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

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

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

@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);
    }
}

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM