ASP.NET Core中如何迭代字符串存储的数组并拼接关联值返回给KendoUI网格
实现方案
1. 扩展实体模型新增处理后存储字段
首先给OfficeReview实体新增字段存储拼接完成的带标签内容,解决处理结果无法随模型返回的问题:
namespace MyCompany.Data { public class OfficeReview : BaseEntity { public string Office_Ids { get; set; } // 新增字段存储处理后的带标签内容 public string ProcessedOfficeInfo { get; set; } } }
2. 预加载办公场所映射字典
提前把办公表的ID和名称对应关系加载到内存字典,避免循环查询数据库,完成ID和名称的关联匹配:
// 此处替换为你实际的办公表查询逻辑 var officeMap = _dbContext.Offices.ToDictionary( keySelector: x => x.Id, elementSelector: x => x.OfficeName );
3. 重构控制器拼接逻辑
放弃原有的Insert拼接方案,使用StringBuilder动态适配任意长度的ID数组,完整控制器代码如下:
using Kendo.Mvc.Extensions; using Kendo.Mvc.UI; using System.Text; // Kendo网格读取方法默认接收DataSourceRequest参数用于分页、排序、过滤 public IActionResult Read([DataSourceRequest] DataSourceRequest request) { // 预加载办公场所映射 var officeMap = _dbContext.Offices.ToDictionary(x => x.Id, x => x.OfficeName); // 先把原始数据加载到内存处理(EF Core无法直接翻译字符串拆分逻辑到SQL) var reviewList = _company.GetAll().ToList(); foreach (var review in reviewList) { if (string.IsNullOrWhiteSpace(review.Office_Ids)) { review.ProcessedOfficeInfo = string.Empty; continue; } // 拆分并清洗ID字符串 var validIds = review.Office_Ids .Split(',', StringSplitOptions.RemoveEmptyEntries) .Select(x => x.Trim('"', ' ')) .Where(x => int.TryParse(x, out _)) .Select(int.Parse) .ToList(); // 按要求格式拼接 var sb = new StringBuilder(); // 如果需要外层包裹双引号就打开下一行注释 // sb.Append('"'); foreach (var id in validIds) { // 匹配名称,无匹配时返回默认值 var officeName = officeMap.TryGetValue(id, out var name) ? name : "未知办公场所"; sb.Append($"<OfficeId>{id}</OfficeId><OfficeName>{officeName}</OfficeName>"); } // 如果需要外层包裹双引号就打开下一行注释 // sb.Append('"'); review.ProcessedOfficeInfo = sb.ToString(); } // 适配Kendo网格返回格式 return Json(reviewList.AsQueryable().ToDataSourceResult(request)); }
4. 前端Kendo网格绑定
前端网格配置中直接绑定ProcessedOfficeInfo字段即可,如果你需要基于标签内容做自定义样式渲染,可通过列模板解析内容:
$("#grid").kendoGrid({ dataSource: { transport: { read: { url: "/你的控制器路径/Read", dataType: "json" } }, schema: { model: { fields: { // 其他字段配置 ProcessedOfficeInfo: { type: "string" } } } } }, columns: [ // 其他列配置 { field: "ProcessedOfficeInfo", title: "办公场所", // 自定义渲染模板示例,可根据业务需求解析标签内容做样式调整 template: function(dataItem) { return dataItem.ProcessedOfficeInfo; // 如果需要自定义渲染可以写解析逻辑,比如提取所有OfficeName用逗号分隔 // let names = dataItem.ProcessedOfficeInfo.match(/<OfficeName>([^<]+)<\/OfficeName>/g).map(item => item.replace(/<\/?OfficeName>/g,'')); // return names.join('、'); } } ] });
注意事项
- 如果办公表数据量极大,可按需筛选映射范围,无需全量加载
- 若办公名称包含特殊字符,建议拼接时使用
HttpUtility.HtmlEncode做编码处理,避免XSS风险 - 无效ID(无法转成整型、不存在于映射字典)的处理逻辑可根据业务需求调整
内容的提问来源于stack exchange,提问作者Yanayaya
相关产品推荐
相关产品推荐

