ASP.NET MVC 在 jquery DataTables 中显示 Enum 列中的文本?
Posted
技术标签:
【中文标题】ASP.NET MVC 在 jquery DataTables 中显示 Enum 列中的文本?【英文标题】:ASP.NET MVC showing text from Enum column in jquery DataTables? 【发布时间】:2016-12-12 08:55:48 【问题描述】:我应该如何显示枚举列中的文本而不是它在 jQuery DataTable 中的值,而不会丢失它的值,因为我稍后将使用它进行编辑?
给定一个类:
public class Person
[Key]
public int PersonUID get; set;
public string FirstName get; set;
public EstadoPersona Status get; set;
还有一个枚举:
public enum EstadoPersona
Active, Inactive
我正在使用 Controller 中的以下操作填充 jQuery DataTable:
public ActionResult List()
var data = db.People.Select(
a => new
a.FirstName,
a.Status,
a.PersonUID
).OrderByDescending(a => a.PersonUID).ToList();
return Json(data, JsonRequestBehavior.AllowGet);
这是我的 DataTable 设置:
$("#tblPersons").DataTable(
processing: true,
dom: 'Brtip',
ajax:
type: "POST",
url: "/People/List",
dataType: "json",
contentType: "application/json; charset=utf-8",
data: function (data)
return data = JSON.stringify(data);
,
dataSrc: "",
error: function (jqXHR, textStatus, errorThrown)
debugger; alert("ajax error: " + textStatus);
,
columns: [
data: "FirstName" ,
data: "Status",
data: "PersonUID"
],
rowId: 'PersonUID',
,
order: [],
);
【问题讨论】:
所以您正在尝试使用 jquery 数据表插件?请更改您的问题的标签。datatable
模棱两可
是的,确实...我正在使用 jQuery DataTables。我正在尝试更改相关的标签,但点击保存后它不会持续存在。
【参考方案1】:
使用 Json.Net http://www.newtonsoft.com/json 并为 Enum 类型列装饰以下属性
public class Person
[Key]
public int PersonUID get; set;
public string FirstName get; set;
[JsonConverter(typeof(StringEnumConverter))]
public EstadoPersona Status get; set;
将值发布为"Status":"Active"
或"Status":"InActive"
而不是"Status":0
或"Status":1
【讨论】:
【参考方案2】:注意:我写了这个完整的答案,说在我链接的问题中你无法找到一种方法来表明你不能(d'oh),使用JSON.NET 扩展。如果您愿意使用该扩展程序,请参阅编辑(非常棒)。
原答案
见this stack overflow question(引用下面的重要答案)
javascriptSerializer
[将数据转换为 JSON 时使用的内容] 将enums
序列化为它们的数值,而不是它们的string
表示形式。您需要使用自定义序列化将枚举序列化为其名称而不是数值。
很遗憾,当您将 enum
转换为 JSON 时,它已转换为 int
并且 enum
状态已丢失。
这意味着您不能简单地发送字符串(无论如何这对您来说还不够好,因为您希望同时拥有字符串值和数值)。
我建议将发送到 DataTables 的对象更改为 KeyValuePair<string,int>
。现在,这不是一个完美的解决方案,因为您必须在发送之前和接收数据之后从enum
转换为KeyValuePair
,但这可能是保留字符串名称和在 JavaScript 中使用它们时相互附加的数值。
基本上,您必须修改发送到 DataTables 的对象的创建,以便在创建对象时创建键值对,而不是仅添加 a.status
。
虽然这并不是您真正想要的,但不幸的是,您不能将enum
序列化为 JSON 并保留名称,而只保留值。您必须在序列化过程中将enum
转换为另一种可以保存两个值(KeyValuePair
、数组、Dictionary
等)的类型,或者停止使用枚举。
编辑:进一步研究链接的问题后,看起来如果您使用 JSON.NET 扩展,您实际上可以序列化枚举。如果您愿意使用该扩展程序,那可能是解决您问题的一个很好的解决方案。我以前用过,挺好用的,不难用。
[JsonConverter(typeof(StringEnumConverter))]
是您使用 JSON.NET 时使用的语法。您可以在我链接的问题的第二个答案中获得更多详细信息。
编辑 2: 在看到 Vijai 的回答后(它展示了如何将上述属性实际添加到 your 类的一个很好的示例),看来这只会发送enum
的字符串名称,而不是名称和值。如果您需要字符串和 int 值,您可能仍然需要发送 enum
以外的对象,就像我原来的答案一样。
【讨论】:
以上是关于ASP.NET MVC 在 jquery DataTables 中显示 Enum 列中的文本?的主要内容,如果未能解决你的问题,请参考以下文章
jQuery ajax 在 asp.net mvc 中上传文件
如何在 ASP.NET MVC 中使用 flot 和 jQuery?
ASP.net MVC 3 jQuery 验证;禁用不显眼的 OnKeyUp?
jQuery Ajax POSTing 数组到 ASP.NET MVC 控制器