Blazor Server端WebAPI如何仅返回employeeID数组而非任务状态信息
问题解决:WebAPI返回仅含EmployeeID的对象数组
问题根源
你代码里的reader.GetFieldValueAsync<string>(0)是异步方法,没有添加await关键字,导致实际存入集合的是Task<string>对象而非字符串值。JSON序列化时会把Task对象的所有属性(如result、status等)都输出,这就是返回结果里出现多余状态字段的原因。
修改后的接口代码
给GetFieldValueAsync添加await,获取实际的字符串值:
[HttpGet] [Route("GetAllEmployee/{searchText}")] public async Task<IActionResult> GetAllEmployee(string searchText) { string query = "SELECT cast(EMP.YAAN8 as varchar(20)) as EmployeeID,EMP.YAALPH AS EmployeeName FROM CRPDTA.F060116 EMP WHERE cast(EMP.YAAN8 as varchar(20)) LIKE '%" + searchText + "%' WITH UR"; try { ICollection<object> ApplicationsDataValues = new List<object>(); using (var command = con.CreateCommand()) { command.CommandText = query; command.CommandType = CommandType.Text; await command.Connection.OpenAsync(); using (var reader = await command.ExecuteReaderAsync()) { while (await reader.ReadAsync()) { ApplicationsDataValues.Add(new { // 添加await获取实际字符串值 EmployeeID = await reader.GetFieldValueAsync<string>(0) }); } } } await con.CloseAsync(); return StatusCode(200, ApplicationsDataValues); } catch (Exception e) { return StatusCode(500, e); } }
额外优化建议
- 避免SQL注入风险:当前代码直接拼接
searchText到SQL语句中,存在SQL注入漏洞,建议改用参数化查询:
query = "SELECT cast(EMP.YAAN8 as varchar(20)) as EmployeeID,EMP.YAALPH AS EmployeeName FROM CRPDTA.F060116 EMP WHERE cast(EMP.YAAN8 as varchar(20)) LIKE @searchText WITH UR"; // 添加参数 command.Parameters.AddWithValue("@searchText", $"%{searchText}%");
- 使用强类型模型:可以定义一个简单的
EmployeeDto类代替匿名对象,提高代码可读性和可维护性:
public class EmployeeDto { public string EmployeeID { get; set; } } // 集合改为List<EmployeeDto> List<EmployeeDto> ApplicationsDataValues = new List<EmployeeDto>(); // 添加时实例化Dto ApplicationsDataValues.Add(new EmployeeDto { EmployeeID = await reader.GetFieldValueAsync<string>(0) });
修改后预期返回结果
修改后接口会返回符合预期的JSON:
[ { "employeeID": "212334" }, { "employeeID": "212331" } ]
内容的提问来源于stack exchange,提问作者ahmed abdelaziz
相关产品推荐
相关产品推荐

