ASP.NET MVC显示jquery DataTables中Enum列的文本

本文关键字:Enum 文本 DataTables NET MVC 显示 jquery ASP | 更新日期: 2023-09-27 18:01:00

我应该如何显示枚举列中的文本,而不是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: [],
            });

ASP.NET MVC显示jquery DataTables中Enum列的文本

使用Json.Nethttp://www.newtonsoft.com/json并装饰枚举类型列的以下属性

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}

注意:我写了整个答案,说你找不到方法,然后在我链接的问题中找到了方法,表明你不能(d'oh(使用JSON.NET扩展。如果您愿意使用该扩展,请参阅编辑(非常棒(。

原始答案

参见这个堆栈溢出问题(引用下面的重要答案(

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的答案(它显示了一个很好的例子,说明了如何将上述属性添加到您的类中(后,它似乎只发送enum的字符串名称,而不是名称和值。如果您想要字符串和int值,您可能仍然需要发送enum以外的对象,就像我最初的回答一样。