我应该如何显示枚举列中的文本而不是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: [],
});
注意:我写了整个答案,说您无法使用JSON.NET扩展名找到我所链接的问题,以表明您做不到(d'oh)。如果您愿意使用该扩展名,请查看“编辑”(非常好)。
原始答案
请参阅此堆栈溢出问题(在下面引用了重要的答案)
JavaScriptSerializer
[将数据转换为JSON时使用的内容]会序列化enums
为其数值,而不是其string
表示形式。您将需要使用自定义序列化来将枚举序列化为其名称而不是数字值。
不幸的是,当您将转换enum
为JSON时,它已转换为,int
并且enum
状态已丢失。
这意味着您不能简单地发送字符串(无论如何,这对您来说是不够的,因为您希望同时拥有字符串值和数字值)。
我建议做的是将发送到DataTables的对象更改为KeyValuePair<string,int>
。现在,这是不是一个完美的解决方案,因为你必须从转换enum
到KeyValuePair
您发送之前和收到数据后,但它可能保持字符串名称和连接到相互数值的最简单方法在JavaScript中使用它们时。
基本上,您必须修改对发送到DataTables的a.status
对象的创建,以便创建键-值对,而不是仅添加即可在该对象创建中创建。
尽管这并不是您真正想要的,但不幸的事实是您无法将序列enum
化为JSON并仅保留名称,仅保留值。您必须在序列化过程中将in转换enum
为可以容纳两个值(KeyValuePair
,数组,aDictionary
等等)的另一种类型,或者仅停止使用枚举。
编辑:在进一步研究链接的问题时,如果您使用JSON.NET扩展,则看起来实际上可以序列化枚举。如果您愿意使用该扩展名,那可能是解决您的问题的一个很好的解决方案。我以前使用过它,它非常有用,并且不难使用。
[JsonConverter(typeof(StringEnumConverter))]
是使用JSON.NET时要使用的语法。您可以在我链接的问题的第二个答案中获得更多详细信息。
编辑2:看到Vijai的回答(你如何将实际添加上述属性,一个很好的例子显示了在你的类),看来这将只发送的字符串名称enum
,而不是两个名称和值。enum
如果要同时使用string和int值,则可能仍然需要发送除之外的其他对象,如我的原始答案一样。
本文收集自互联网,转载请注明来源。
如有侵权,请联系[email protected] 删除。
我来说两句