C# 如何将lambda传递给Razor助手方法?

C# 如何将lambda传递给Razor助手方法?,c#,asp.net-mvc,razor,lambda,html-helper,C#,Asp.net Mvc,Razor,Lambda,Html Helper,我有一个razor助手方法,需要接受一个Func,它将返回一些HTML内容以打印出来。这就是我最初拥有的: @helper node(string title, Func<HelperResult> descriptions) { .... <div>@descriptions()</div> .... } @node("title", new Func<HelperResult>(() =&

我有一个razor助手方法,需要接受一个
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>);
              }))
这样可以正确打印
span
标记。不幸的是,调用此
Func
时,我必须传入一个无用的参数

现在的问题是,我真正的函数不仅仅是写一些跨距。更像这样:

@node("title",                     
              ((Func<dynamic, HelperResult>)(@<text>
              <span>@Helpers.Format(resource.Description,"item")</span>
              </text>))
@helper Node(string title, Func<HelperResult> descriptions)
{
    <div>@descriptions()</div>
}

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

@Node("title", Description)
myFunction( () => doSomething)
@节点(“标题”,
((Func)(@
@Helpers.Format(资源.说明,“项”)
))
其中,
@Helpers.Format
是另一个帮助程序,资源是页面模型中的(动态)变量

当然,现在代码运行了,但没有输出任何内容(在
标记内)。我在
Format
helper函数内放置了一个断点,它命中了它,并且所有参数都正确设置,所以我不确定为什么它不能正确输出。同样,如果我将其更改为 资源.说明 然后什么也得不到输出


由于它在这种情况下运行良好,我想知道Razor的内联帮助程序是否没有捕获外部变量?

实际上,HelperResult是Microsoft希望您不要使用的东西,文档证明了这一点:

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

摘要:此类型/成员支持.NET Framework基础架构 并且不打算直接从代码中使用

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

@node("title",                     
              ((Func<dynamic, HelperResult>)(@<text>
              <span>@Helpers.Format(resource.Description,"item")</span>
              </text>))
@helper Node(string title, Func<HelperResult> descriptions)
{
    <div>@descriptions()</div>
}

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

@Node("title", Description)
myFunction( () => doSomething)
因此,您的函数调用应该是:

@node("title", () =>                    
              @<text>
              <span>"desc1"</span>
              <span>"desc2"</span>
              </text>)
@node(“title”,()=>
@
“描述1”
“描述2”
)

由于这些助手的未来,我会考虑切换到HTML的小片段或更大的块。

<代码> @测试(new Func[] {@你好})
@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);
    }
}
@测试(新函数[]{@hello,@world}) @辅助测试(参数Func[]结果) { foreach(结果中的var结果) { @结果(空); } }
最好不要让HelperResult的未来“不确定”!我们在公司的fluid bootstrap库中广泛使用HelperResult(等待更多的完善,直到我们在github上共享)。当他们说:“并且不打算直接从您的代码中使用它时,”这并不意味着他们会支持它,只是它不会经常出现在您的代码中。但许多/大多数MVC工具集/低级库都依赖于这些东西。“这些助手的未来有点可疑”-在那个链接里有人这么说吗?谢天谢地,我没有看到。干杯。例如,这让我们能够强大而漂亮地将Razor代码直接添加到库中:-public void add(Func html){add(html.ToString();}---用户从来没有看到过这些函数,他们只知道它们可以在一个链中调用somecontrol.add(@howdy@NicholasPetersen一个主要的商业图书馆,剑道网格,使用了这些AFAIK,
.Template(@@item.Blah)
,如果这让你放心的话。你有关于这些“MVC内联模板”的好文档吗变奏曲中出现了很多不相关的文章。它们看起来确实很强大,我想自己更多地使用它们。感谢Aaron提供的信息!是的,这让我感到轻松。我不知道我是否理解你关于“mvc内联模板”的问题,你是指剑道是如何使用它们的?但不知道,这是有意义的,任何给定的控件您可以允许用户使用此技术自定义输出的某些部分(允许向其中传递razor代码)。我来晚了一点,但我只想指出,我谈论的是@helper语法,而不是HelperResult类,尽管它们可能密切相关。我引用的是“marcind”,他在ASP.NET MVC上工作:>正如你所说,我怀疑微软会在知道有很多库使用它的情况下突然删除它。