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 控制器

用数据 ASP.NET CORE MVC Jquery 填充弹出模式

ASP.Net MVC在AspNet Mvc使用JQuery AutoComplete组件