Asp.Net Core Web Api方法返回元组失效,客户端获空值如何解决?
问题解决步骤
1. 修复客户端请求URL的占位符替换问题
你当前客户端代码里的URL是硬编码的"api/account/GetPerson/{id}",这里的{id}并没有被替换成实际传入的参数值,导致服务端收到的id是默认值0,自然查询不到对应数据返回空元组。
修改客户端代码,使用字符串插值替换占位符:
public async Task<(Person, List<ContactData>)> GetPerson(int id) { // 使用$符号进行字符串插值,将实际id值传入URL var tuple = await Http.GetFromJsonAsync<(Person, List<ContactData>)>($"api/account/GetPerson/{id}"); return tuple; }
2. 优化元组的序列化/反序列化兼容性
无命名值元组在序列化时会被序列化为带有Item1、Item2属性的JSON对象,虽然客户端用相同的无命名元组理论上可以反序列化,但使用命名元组能避免潜在的匹配问题,让序列化逻辑更清晰:
服务端修改:
[HttpGet("GetPerson/{id}")] [Authorize(Roles = "Administrators")] // 给元组的两个元素命名 public async Task<(Person Person, List<ContactData> ContactDatas)> GetPerson(int id = 0) { Data.ThePerson person = new Data.ThePerson(); List<ContactData> cDatas = person.contactDatas.Where(it => it.ContactId == id).ToList(); var p = person.persons.FirstOrDefault(p => p.Id == id); return (Person: p, ContactDatas: cDatas); }
客户端对应修改:
// 使用和服务端一致的命名元组类型 public async Task<(Person Person, List<ContactData> ContactDatas)> GetPerson(int id) { var tuple = await Http.GetFromJsonAsync<(Person Person, List<ContactData> ContactDatas)>($"api/account/GetPerson/{id}"); return tuple; }
3. 验证服务端数据查询逻辑(可选)
虽然你提到服务端能正确构建元组,但可以在服务端添加日志或断点,确认传入的id参数是否正确,以及person.persons和person.contactDatas中是否存在对应id的数据,排除数据源本身的问题。
内容的提问来源于stack exchange,提问作者mz1378
相关产品推荐
相关产品推荐

