13

我有一个剃须刀辅助方法需要接受一个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标签。不幸的是,我在调用 this 时必须传入一个无用的参数Func

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

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

另一个助手在哪里@Helpers.Format,资源是页面模型中的(动态)变量。

当然现在代码运行但没有打印出来(在<span>标签内)。我在我的辅助函数中放置了一个断点Format,它会命中它并且所有参数都已正确设置,所以我不确定它为什么不能正确输出。同样,如果我只是将其更改为 resource.Description 则仍然没有任何输出。

由于它在此上下文之外运行良好,我想知道 Razor 的内联助手是否不捕获外部变量?

4

2 回答 2

9

实际上 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用于更大的块。

于 2013-01-22T19:39:38.047 回答
3
@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);
    }
}
于 2014-03-08T09:24:16.613 回答