调用API填充ASP.NET GridView遇序列化问题求助
解决ASP.NET WebForm中API数据填充表格的序列化问题
你代码里的核心问题是重复序列化API返回的JSON,而且没有正确解析出data数组里的实际数据,导致整个JSON字符串被当成一条记录塞进表格了。下面是具体的修复方案:
步骤1:创建对应的数据实体类
先定义和API返回结构匹配的实体类,方便反序列化时映射数据:
// API响应的外层结构 public class ApiResponse { public bool success { get; set; } public string message { get; set; } public List<Document> data { get; set; } } // 单个文档的数据结构 public class Document { public string A1 { get; set; } public string A2 { get; set; } public string file_name { get; set; } public string file_type { get; set; } public DateTime created_datetime { get; set; } public string created_by { get; set; } public bool active { get; set; } public string updated_by { get; set; } public DateTime? updated_datetime { get; set; } }
步骤2:修正API调用与反序列化代码
把你的BindGridView1方法改成这样,重点解决序列化错误和数据提取问题:
private async void BindGridView1() { string apiUrl = "http://mesappbeta/BE_API_HOME/api/SeriesBlacklist/Req_UploadedDocs?series=AE01400&series_type=RU"; using (var client = new HttpClient()) { client.DefaultRequestHeaders.Accept.Add(new MediaTypeWithQualityHeaderValue("application/json")); HttpResponseMessage response = await client.GetAsync(apiUrl); // 用await替代.Result,避免阻塞死锁 if (response.IsSuccessStatusCode) { // 直接读取API返回的JSON字符串,不要重复序列化 string json = await response.Content.ReadAsStringAsync(); // 反序列化为强类型对象,直接获取data数组 var apiResponse = JsonConvert.DeserializeObject<ApiResponse>(json); DataTable dt = new DataTable(); dt.Columns.Add("file_name"); dt.Columns.Add("file_type"); dt.Columns.Add("created_datetime"); // 遍历data数组里的每个文档,提取需要的字段填入DataTable foreach(var doc in apiResponse.data) { dt.Rows.Add(doc.file_name, doc.file_type, doc.created_datetime.ToString("yyyy-MM-dd HH:mm:ss")); } GridView2.DataSource = dt; GridView2.DataBind(); } } }
关键修正点说明
- 移除了
JsonConvert.SerializeObject(response.Content.ReadAsStringAsync().Result):API返回的已经是JSON字符串,再次序列化会把它转成带转义符的字符串,自然会被当成单条数据。 - 使用
JsonConvert.DeserializeObject<ApiResponse>(json)解析JSON:把字符串转成强类型对象后,就能直接访问data数组里的每一条文档数据。 - 替换
.Result为await:异步方法里用.Result容易引发死锁,await是更安全的异步调用方式。
额外优化(可选)
如果不想手动构建DataTable,也可以直接把data数组绑定到GridView,只需在前端配置列即可:
<asp:GridView ID="GridView2" runat="server" AutoGenerateColumns="false"> <Columns> <asp:BoundField DataField="file_name" HeaderText="文件名" /> <asp:BoundField DataField="file_type" HeaderText="文件类型" /> <asp:BoundField DataField="created_datetime" HeaderText="创建时间" DataFormatString="{0:yyyy-MM-dd HH:mm:ss}" /> </Columns> </asp:GridView>
然后代码里直接绑定:
GridView2.DataSource = apiResponse.data; GridView2.DataBind();
这种方式更简洁,省去手动构建DataTable的步骤。
内容的提问来源于stack exchange,提问作者Guru
相关产品推荐
相关产品推荐

