如何将AJAX JSON响应中的枚举int值转换为对应字符串值
枚举返回整数转字符串展示方案
问题场景
当前ASP.NET MVC项目实现Todo列表功能时存在如下问题:
Todo模型中StatusOfCompletion为枚举类型- 后端
HomeController的DisplayList接口直接返回List<Todo>的JSON结果 - 前端Index视图通过AJAX拉取数据拼接表格,接口默认返回枚举对应的整数值,导致表格展示数字而非枚举文本
推荐方案:后端序列化时直接输出枚举字符串
这个方案不需要改动前端逻辑,一次配置后所有相关接口都能直接返回枚举字符串,维护成本最低。
零依赖快速修改(无需引入第三方库)
直接修改DisplayList接口,返回结果时将枚举字段转为字符串即可:
public JsonResult DisplayList() { // 投影转换时将枚举转为字符串 var returnData = ListOfTodos.Select(todo => new { todo.ItemId, todo.Description, todo.StartDate, todo.EndDate, StatusOfCompletion = todo.StatusOfCompletion.ToString() }); return Json(returnData, JsonRequestBehavior.AllowGet); }
改完后接口返回的StatusOfCompletion字段直接是"YetToStart"这类文本,原有前端拼接逻辑不用做任何修改,就能正常展示枚举文本。
全局配置(适合项目中多处用到枚举序列化的场景)
如果项目里已经引入了Newtonsoft.Json(Json.NET,大部分MVC项目默认都会集成),可以直接全局配置所有JSON接口自动将枚举序列化为字符串,不用单独修改每个接口:
- 打开
Global.asax.cs文件 - 在
Application_Start方法中添加如下配置:
using Newtonsoft.Json; using Newtonsoft.Json.Converters; protected void Application_Start() { // 其他原有配置保持不变 // 给JSON序列化器添加枚举转字符串的转换器 GlobalConfiguration.Configuration.Formatters.JsonFormatter.SerializerSettings.Converters.Add(new StringEnumConverter()); }
配置完成后,所有接口返回的枚举字段都会默认输出字符串名称。
备选方案:前端映射转换
如果暂时不能修改后端代码,也可以在前端JS中维护一份枚举映射表,渲染时做转换:
- 在AJAX请求逻辑前添加枚举映射,映射关系和后端
Status枚举的定义保持完全一致:
// 枚举值:枚举名称 对应关系和后端对齐 const statusTextMap = { 0: "YetToStart", 1: "InProgress", 2: "Completed" // 后续新增枚举项在这里同步补充 };
- 修改表格拼接逻辑,将原来直接取
data[i].StatusOfCompletion的位置替换为映射取值:
str = "<tr><td>" + (i + 1) + "</td><td>" + data[i].ItemId + "</td><td>" + data[i].Description + "</td><td>" + convertToJavaScriptDate(data[i].StartDate) + "</td><td>" + convertToJavaScriptDate(data[i].EndDate) + "</td><td>" + statusTextMap[data[i].StatusOfCompletion] + "</td><td><a href=/home/edit/" + data[i].ItemId + ">Edit</a></td></tr>";
注意:这个方案需要前后端枚举定义保持同步,后续后端修改枚举值/名称时必须同步更新前端映射表,否则会出现展示错误。
内容的提问来源于stack exchange,提问作者Aman Kadakuntla
相关产品推荐
相关产品推荐

