Blazor中如何拦截EventCallback扩展第三方组件OnRead逻辑?
可行实现方案
方案一:封装自定义Grid组件(推荐批量使用场景)
通过创建继承自TelerikGrid<T>的自定义组件,内部接管OnRead事件,先执行用户传入的业务逻辑,再统一执行后置代码。这种方式只需在项目中替换原TelerikGrid的引用,无需在每个页面重复编写包装逻辑。
public partial class CustomTelerikGrid<T> : TelerikGrid<T> { // 接收用户自定义的业务处理回调 [Parameter] public EventCallback<GridReadEventArgs> UserOnRead { get; set; } [Inject] protected IJSRuntime JSRuntime { get; set; } protected override void OnInitialized() { // 将组件的OnRead事件指向我们的处理方法 base.OnRead = HandleCombinedOnRead; base.OnInitialized(); } private async Task HandleCombinedOnRead(GridReadEventArgs args) { // 先执行用户的业务逻辑 if (UserOnRead.HasDelegate) { await UserOnRead.InvokeAsync(args); } // 执行统一的后置操作 await JSRuntime.InvokeVoidAsync("attachAllGridCells"); } }
使用时,将原TelerikGrid替换为CustomTelerikGrid,并把原OnRead绑定到UserOnRead参数:
<CustomTelerikGrid TItem="YourDataModel" UserOnRead="@YourOriginalOnReadHandler"> <!-- 保留原有的列配置、分页等参数 --> <GridColumns> <GridColumn Field="@nameof(YourDataModel.Id)" /> <!-- 其他列 --> </GridColumns> </CustomTelerikGrid>
方案二:回调包装器(灵活场景)
如果不想替换所有TelerikGrid引用,可以创建一个静态包装方法,在需要的页面中包装原OnRead回调,实现后置逻辑的统一执行。
public static class GridCallbackHelper { public static Func<GridReadEventArgs, Task> WrapWithPostAction(Func<GridReadEventArgs, Task> userCallback, IJSRuntime jsRuntime) { return async args => { // 执行用户业务逻辑 await userCallback(args); // 执行统一后置操作 await jsRuntime.InvokeVoidAsync("attachAllGridCells"); }; } }
在页面组件中使用:
[Inject] protected IJSRuntime JSRuntime { get; set; } // 包装后的回调属性 public Func<GridReadEventArgs, Task> WrappedOnRead { get; set; } protected override void OnInitialized() { // 包装原有的业务处理方法 WrappedOnRead = GridCallbackHelper.WrapWithPostAction(OriginalOnReadHandler, JSRuntime); base.OnInitialized(); } // 原有的业务处理方法 private async Task OriginalOnReadHandler(GridReadEventArgs args) { args.Data = _myClient.GetData(); }
在Razor视图中绑定包装后的回调:
<TelerikGrid TItem="YourDataModel" OnRead="@WrappedOnRead"> <!-- 列配置等 --> </TelerikGrid>
内容的提问来源于stack exchange,提问作者Dylan El Bar
相关产品推荐
相关产品推荐

