ASP.NET MVC Core中ExportToPDF方法实现错误求助
解决ASP.NET MVC Core ExportToPDF中的类型转换错误
错误原因分析
- 第一个错误:你在LINQ查询中返回了混合类型的数组,却强制转换为
List<EmployeeCategory>,数组与实体类类型完全不兼容,导致无法转换。 - 第二个错误:
new[] {employee.Id, employee.Name, ...}里同时包含int、string、double多种类型,C#无法自动推断出这个隐式数组的统一类型。
方案一:直接使用EmployeeCategory实体列表(推荐)
不需要将实体转成数组,直接查询获取实体列表,在构建HTML时逐个将属性转为字符串即可,代码更易读且保留类型处理灵活性:
修改ExportToPDF方法的数据获取和循环部分:
[HttpPost] public FileResult ExportToPDF() { // 直接获取EmployeeCategory实体列表 List<EmployeeCategory> employees = Context.EmployeeCategories.Take(6).ToList(); StringBuilder sb = new StringBuilder(); sb.Append("<table border='1' cellpadding='5' cellspacing='0' style='border: 1px solid #ccc;font-family: Arial; font-size: 10pt;'>"); // 表头部分保持不变 sb.Append("<tr>"); sb.Append("<th style='background-color: #B8DBFD;border: 1px solid #ccc'>Id</th>"); sb.Append("<th style='background-color: #B8DBFD;border: 1px solid #ccc'>Name</th>"); sb.Append("<th style='background-color: #B8DBFD;border: 1px solid #ccc'>LastName</th>"); sb.Append("<th style='background-color: #B8DBFD;border: 1px solid #ccc'>Address</th>"); sb.Append("<th style='background-color: #B8DBFD;border: 1px solid #ccc'>NetSalary</th>"); sb.Append("<th style='background-color: #B8DBFD;border: 1px solid #ccc'>GrossSalary</th>"); sb.Append("</tr>"); // 遍历实体,逐个处理属性 foreach (var employee in employees) { sb.Append("<tr>"); // 处理可空字符串避免显示null,格式化数值提升可读性 sb.Append($"<td style='border: 1px solid #ccc'>{employee.Id}</td>"); sb.Append($"<td style='border: 1px solid #ccc'>{employee.Name ?? string.Empty}</td>"); sb.Append($"<td style='border: 1px solid #ccc'>{employee.LastName ?? string.Empty}</td>"); sb.Append($"<td style='border: 1px solid #ccc'>{employee.Address ?? string.Empty}</td>"); sb.Append($"<td style='border: 1px solid #ccc'>{employee.NetSalary.ToString("N2")}</td>"); sb.Append($"<td style='border: 1px solid #ccc'>{employee.GrossSalary.ToString("N2")}</td>"); sb.Append("</tr>"); } sb.Append("</table>"); // PDF生成部分保持不变 using (MemoryStream stream = new MemoryStream(Encoding.ASCII.GetBytes(sb.ToString()))) { ByteArrayOutputStream byteArrayOutputStream = new ByteArrayOutputStream(); PdfWriter writer = new PdfWriter(byteArrayOutputStream); PdfDocument pdfDocument = new PdfDocument(writer); pdfDocument.SetDefaultPageSize(PageSize.A4); HtmlConverter.ConvertToPdf(stream, pdfDocument); pdfDocument.Close(); return File(byteArrayOutputStream.ToArray(), "application/pdf", "EmployeeList.pdf"); } }
方案二:统一转为string数组列表
如果坚持使用数组方式,需要在查询时明确将所有属性转为string,确保数组类型统一:
修改数据获取部分:
List<string[]> employees = (from employee in Context.EmployeeCategories.Take(6) select new string[] { employee.Id.ToString(), employee.Name ?? string.Empty, employee.LastName ?? string.Empty, employee.Address ?? string.Empty, employee.NetSalary.ToString(), employee.GrossSalary.ToString() }).ToList();
后续的循环部分可以保持原代码不变,此时employees是List<string[]>类型,不会再出现类型转换错误。
内容的提问来源于stack exchange,提问作者Unity_cube
相关产品推荐
相关产品推荐

