You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.09.26 19:54:04