如何在Blazor中传递KeyboardEventArgs至C#方法并修复委托推断错误
问题:Blazor中@onkeydown:preventDefault委托类型无法推断的修复方案
我需要实现Vue类组件中onKeyDown方法的Blazor/C#等效功能,原Vue代码如下:
import { Vue, Component, Prop } from "nuxt-property-decorator"; @Component() export default class TextBox extends Vue implements ValidatableControl { @Prop({ type: Boolean, default: false }) private readonly valueMustBeNonNegativeIntegerOfRegularNotation!: boolean; @Prop({ type: Boolean, default: false }) private readonly valueMustBeDigitsSequence!: boolean; protected onKeyDown(event: KeyboardEvent): void { if ((this.valueMustBeNonNegativeIntegerOfRegularNotation || this.valueMustBeDigitsSequence) && /^[+\-e.]$/u.test(event.key)) { event.preventDefault(); } } }
我知道Blazor没有类似event.preventDefault的命令式API,因此尝试使用Razor模板中的声明式API:
<textarea @onkeydown:preventDefault=@(args => mustPreventOnKeyDownEvent(args)) ></textarea>
对应的C#类组件代码:
public partial class TextBox : InputtableControl, IValidatableControl { [Microsoft.AspNetCore.Components.Parameter] public bool valueMustBeTheDigitsSequence { get; set; } = false; // 注:此处补充定义原Vue中对应的参数 [Parameter] public bool valueMustBeTheNonNegativeIntegerOfRegularNotation { get; set; } = false; private bool mustPreventOnKeyDownEvent(Microsoft.AspNetCore.Components.Web.KeyboardEventArgs keyboardEventArguments) => (this.valueMustBeTheNonNegativeIntegerOfRegularNotation || this.valueMustBeTheDigitsSequence) && new Regex("^[+\\-e.]$").IsMatch(keyboardEventArguments.Key); }
目前在代码@onkeydown:preventDefault=@(args => mustPreventOnKeyDownEvent(args))处出现以下错误:
The delegate type could not be inferred
错误原因及修复方法
Blazor的@onkeydown:preventDefault指令要求绑定的是接收KeyboardEventArgs参数并返回bool值的委托,但编译器无法自动推断lambda表达式中args的类型,导致委托类型无法识别。
有两种简单的修复方式:
方式一:明确指定参数类型
在lambda表达式中显式声明args的类型,帮助编译器完成推断:
<textarea @onkeydown:preventDefault=@((KeyboardEventArgs args) => mustPreventOnKeyDownEvent(args)) ></textarea>
方式二:直接绑定方法引用
由于你的mustPreventOnKeyDownEvent方法签名完全符合指令要求的委托类型,可以直接绑定方法名称,无需lambda包装:
<textarea @onkeydown:preventDefault="mustPreventOnKeyDownEvent" ></textarea>
额外性能优化建议
每次按键都创建新的Regex实例会产生不必要的性能开销,建议提前初始化静态正则对象:
private static readonly Regex _invalidKeyRegex = new Regex("^[+\\-e.]$", RegexOptions.Compiled); private bool mustPreventOnKeyDownEvent(KeyboardEventArgs keyboardEventArguments) => (valueMustBeTheNonNegativeIntegerOfRegularNotation || valueMustBeTheDigitsSequence) && _invalidKeyRegex.IsMatch(keyboardEventArguments.Key);
内容的提问来源于stack exchange,提问作者Takeshi Tokugawa YD
相关产品推荐
相关产品推荐

