Asp.net core 带有事件的代码中Blazor可重用的RenderFragments:无法将lambda表达式转换为预期的委托类型

Asp.net core 带有事件的代码中Blazor可重用的RenderFragments:无法将lambda表达式转换为预期的委托类型,asp.net-core,blazor,blazor-client-side,blazor-webassembly,Asp.net Core,Blazor,Blazor Client Side,Blazor Webassembly,有人知道为什么下面的方法不起作用吗?如果我删除了“onclick”事件,那么它将按照预期编译和工作。是否不允许我们在中使用事件 Env:ASP.NET核心3.1和Blazor Web组件 提前谢谢你的帮助 无法将lambda表达式转换为预期的委托类型,因为块中的某些返回类型不能隐式转换为委托返回类型 @code{ 渲染碎片rf= val=>\uu生成器=> { 你好@val.category.Name,@val.myId }; }代码中的@onclick处理程序最终将由EventCallba

有人知道为什么下面的方法不起作用吗?如果我删除了“onclick”事件,那么它将按照预期编译和工作。是否不允许我们在中使用事件

Env:ASP.NET核心3.1和Blazor Web组件

提前谢谢你的帮助

无法将lambda表达式转换为预期的委托类型,因为块中的某些返回类型不能隐式转换为委托返回类型

@code{
渲染碎片rf=
val=>\uu生成器=>
{
你好@val.category.Name,@val.myId
};

}
代码中的@onclick处理程序最终将由EventCallbackFactory创建。但是,该工厂需要引用字段初始值设定项不支持的“this”-因此您收到此错误(可能还有另一个与“this”有关的错误)

解决方案非常简单。只需将字段转换为如下属性:

RenderFragment<(CategoryDto category, int myId)> rf => val => __builder =>
{
    <h1 @onclick="() => Console.WriteLine(val.category.Name)">Hello @val.category.Name, @val.myId</h1>
};
RenderFragment rf=>val=>
{
你好@val.category.Name,@val.myId
};

这很有效。你可能想把输入错误“rf()”改为“rf”。谢谢!请注意,现在它没有重用渲染逻辑,因为每次使用它时都会得到新的逻辑。您无法获得额外的性能。@daniherrera我想您可以做的是重写OnInitialized(),然后在那里分配一次RenderFragment。也许@daniherrera不能将其设置为静态,以便始终为我提供相同的实例&我仍然可以从性能中获益?(请注意,在我链接的文章中,有一条建议将RenderFragment设置为静态,以便跨多个页面共享)。非常感谢。