多年来,这一直使我发疯。我使用了以下工作代码
<input @onchange="@((ui) => Console.WriteLine(ui.Value))" />
并将其复制到新的blazor组件项目。然后我开始得到错误
error CS1660: Cannot convert lambda expression to type 'bool' because it is not a delegate type
答案 0 :(得分:2)
由于这浪费了我很多时间,而且错误非常容易误导我以为我会写出来。
问题是缺少@using
,在其中添加了以下内容,一切正常。
@using Microsoft.AspNetCore.Components.Web
我猜想该命名空间中有一些扩展方法,可以使魔术在剃刀生成的代码中起作用...
答案 1 :(得分:2)
不幸的是,添加@using
语句对我不起作用。显然,您现在必须直接在引号内定义lambda表达式,而不必将其包装在@(...)
中,如下所示:
<input @onchange="changeEventArgs => Console.WriteLine(changeEventArgs.Value)" />
有关示例,请参见此参考: https://docs.microsoft.com/en-us/dotnet/architecture/blazor-for-web-forms-developers/components#event-handlers
答案 2 :(得分:0)
这浪费了我很多时间。
对我来说Visual Studio
添加了对我正在调用的子组件的忽略。
我从csproj中删除了忽略项,它按预期工作
答案 3 :(得分:0)
注意:此答案基于 Blazor 客户端;但是,它也可能对 Blazor 服务器端有所帮助。
在我的例子中,我无法让 lambda 表达式起作用,但我仍然需要有一个参数来传递给下一个方法,所以我最终使用了 Action<T>()
。这也适用于自定义组件。我已经根据我使用的内容稍微修改了这个,因为我使用的是枚举而不是 bool。
<MyCustomInput Value="@ValueToChange" ValueExpression="(() => ValueToChange)" ValueChanged="(new Action<bool>(async x => await OnValueChanged(x)))" />
@code {
public bool ValueToChange { get; set; }
private async Task OnIdCountryChanged(bool newValue) {
ValueToChange = newValue;
}
}
如果您使用的是自定义组件,则该组件中将需要以下内容。
[Parameter]
public bool Value { get; set; } = default;
[Parameter]
public EventCallback<bool> ValueChanged { get; set; }
[Parameter]
public Expression<Func<bool>> ValueExpression { get; set; }
答案 4 :(得分:0)