C# 如何将lambda传递给Razor助手方法?
我有一个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>(() =&
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上工作:>正如你所说,我怀疑微软会在知道有很多库使用它的情况下突然删除它。