You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.05 15:25:16