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

Blazor Server .NET7中CS1503错误:方法组无法转换为EventCallback

解决Blazor中@onclick的CS1503类型转换错误

错误原因

Blazor的@onclick绑定的方法必须符合EventCallback要求:返回类型只能是void或Task(异步方法)。你的Search方法返回List<ApplicationDto>,类型不匹配导致无法转换为EventCallback,从而触发CS1503错误。

解决方案

1. 修改Search方法的返回类型

将DashboarBase.cs中的Search方法改为无返回值(void)或异步Task类型,以下是两种实现方式:

同步版本

public void Search()
{
    isLoading = true;
    StateHasChanged(); // 手动触发UI更新,显示加载状态
    
    ApplicationsFilterDto obj = new ApplicationsFilterDto();
    obj.serverID = serverID;
    obj.ownerId = ownerId;
    obj.databaseId = databaseId;
    
    AllApplicationsList = _EmplyeeService.ListOfApplications(obj);
    
    isLoading = false;
    StateHasChanged(); // 更新UI,隐藏加载状态
}

异步版本(推荐,避免阻塞UI)

首先将服务层方法改为异步,并修复SQL注入风险:

// IEmployeeService 接口
Task<List<ApplicationDto>> ListOfApplicationsAsync(ApplicationsFilterDto obj);

// EmployeeService 实现类
public async Task<List<ApplicationDto>> ListOfApplicationsAsync(ApplicationsFilterDto emp)
{
    // 使用参数化查询避免SQL注入
    var appList = await _context.Database.SqlQuery<ApplicationDto>(
        @"select ApplicationsData.ApplicationID as ApplicationId,Application_Name as ApplicationName,CommonName,d.DetailsName as TypeOfApplication,AccessType,d2.DetailsName Criticality,o.OwnerName as ApplicationOwner,DRRequired,se.[DB_Name] as [DataBase] 
          from ApplicationsData 
          left join [dbo].[Details] d with(nolock) on d.ID=ApplicationsData.ApplicationType and d.HeaderId=6 
          left join [dbo].[Details] d2 with(nolock) on d2.ID=ApplicationsData.Criticality and d2.HeaderId=7
          left join dbo.[Owner] o with(nolock) on o.ApplicationId=ApplicationsData.ApplicationID
          left join dbo.[DataBase] se with(nolock) on se.ServerID=ApplicationsData.ServerId 
          where ApplicationsData.ServerId=@serverID OR SE.[DBID]=@databaseId OR o.OwnerId=@ownerId",
        new SqlParameter("@serverID", emp.serverID),
        new SqlParameter("@databaseId", emp.databaseId),
        new SqlParameter("@ownerId", emp.ownerId)
    ).ToListAsync(); 
    
    return appList;  
}

然后修改页面基类的Search方法为异步:

public async Task Search()
{
    isLoading = true;
    // 异步方法中Blazor会自动触发StateHasChanged,无需手动调用
    
    ApplicationsFilterDto obj = new ApplicationsFilterDto();
    obj.serverID = serverID;
    obj.ownerId = ownerId;
    obj.databaseId = databaseId;
    
    AllApplicationsList = await _EmplyeeService.ListOfApplicationsAsync(obj);
    
    isLoading = false;
}

2. 修正其他潜在问题

  • 你提供的筛选模型是EmployeeFilterDto,但实际业务中使用的是ApplicationsFilterDto,请确保ApplicationsFilterDto类已正确定义,且包含serverID、ownerId、databaseId三个属性。
  • 原服务层的SQL查询存在严重SQL注入风险,必须使用参数化查询(上述异步版本已修复),禁止直接拼接用户输入的参数。
  • 注意变量名拼写:_EmplyeeService应为_EmployeeService(缺少字母'o'),避免运行时出现服务注入失败的错误。

内容的提问来源于stack exchange,提问作者ahmed abdelaziz

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.28 05:43:16