enc*_*cee 13 c# asp.net-mvc lambda html-helper 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>);
}))
Run Code Online (Sandbox Code Playgroud)
不幸的是,我的文字永远不会打印出来.也没有错误.
所以我学习了内联帮助器,并将调用方法更改为:
@node("title",
@<text>
<span>"desc1"</span>
<span>"desc2"</span>
</text>)
Run Code Online (Sandbox Code Playgroud)
但是现在我收到编译错误说
"委托'System.Func'不接受1个参数".
但我并没有传递任何论点.
因此,如果我将其更改为Func<object,HelperResult>
然后使用它调用它@descriptions(null)
我得到以下错误:
"如果没有先将lambda表达式转换为委托或表达式树类型,则不能将lambda表达式用作动态调度操作的参数"
我确定我在某处出了点问题,但我不确定它到底是什么.
编辑:我想我可能已经解决了这个问题,但它引入了一些其他问题.
我做的是在传递动态方法之前施放lambda.我猜这就是错误试图说的:
@node("title",
((Func<dynamic, HelperResult>)(@<text>
<span>"desc1"</span>
<span>"desc2"</span>
</text>))
Run Code Online (Sandbox Code Playgroud)
这有效,它可以span
正确地打印出标签.不幸的是,在调用它时我必须传入一个无用的参数Func
.
现在我的问题是我的真正功能不仅仅是写一些跨度.它更像是这样的:
@node("title",
((Func<dynamic, HelperResult>)(@<text>
<span>@Helpers.Format(resource.Description,"item")</span>
</text>))
Run Code Online (Sandbox Code Playgroud)
哪里@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)
Run Code Online (Sandbox Code Playgroud)
在任何情况下,你的第一个想法都不应该工作,因为Func类型的参数实际上等于无参数函数,在这种情况下你需要像这样编写lambda表达式:
myFunction( () => doSomething)
Run Code Online (Sandbox Code Playgroud)
所以你的函数调用应该是:
@node("title", () =>
@<text>
<span>"desc1"</span>
<span>"desc2"</span>
</text>)
Run Code Online (Sandbox Code Playgroud)
由于这些助手的未来有点可疑,我会考虑切换到HtmlHelpers用于html的小片段或用于较大块的Partials.
归档时间: |
|
查看次数: |
7173 次 |
最近记录: |