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
相关产品推荐
相关产品推荐

