在JSON对象属性上对jquery DataTables进行排序 - 使用Orthogonal数据

时间:2016-07-21 20:34:34

标签: c# jquery sorting datatables

使用正确的UI代码更新 - 使用正交数据进行自定义渲染

我在框架4.5.1中使用MVC C#,并且我在使用jquery数据表1.10.7在表中创建自定义排序时遇到问题。 Bootstrap也在项目中使用。

最初的一切都按预期工作,但当我决定自定义渲染列以显示图像时,情况发生了变化。图像渲染得很好,但排序对于这个新列根本不起作用。作为此列的数据源返回的JSON是具有3个属性的对象:Process.Id,Process.Description和Process.ImageUrl。排序应该基于Process.Id。渲染只是创建一个图像标记,并且其中有一些逻辑可以动态地向标题添加一些信息。最后一个渲染创建一个按钮链接以查看更多详细信息。

这是我视图中的数据表初始化,在doc ready期间调用:

更新:当我需要自定义排序值或图片标记时,columnDefs已更新为正确呈现。

function LoadDataTable() {
    table = $('#accountsRequests').DataTable(
      {
          "destroy": true,
          "processing": true,
          "ajax":
              {
                  "type": "GET",
                  "url": "@Url.Action(MyActionName, MyControllerName)"
              }
          , "paging": true
          , "columns": [
                { "data": "UserId" },
                { "data": "Process", title: "Status" },
                { "data": "LastName", "title": "Last Name" },                 
                { "data": "UserId" }
          ]
          , "columnDefs": [
              {
                  "targets": 0, // hiding first column, userId
                  "visible": false,
                  "searchable": false,
                  "sortable": false
              },
                 {
                     "targets": 1,
                     "render": function (data, type, row) {
                         var element = "<img id='status_" + row["UserId"] + "' src='" + data["ImageUrl"] + "' data-order='" + data["Id"] + "' data-sort='" + data["Id"] + "'  title='" + data["Description"] + "";

                           if (type === "sort" || type === 'type') {
                                 return data["Id"];
                             }
                             else {
                                 if (data["Id"] == "2") // add in-process name
                                 {
                                     var userId = row["ProcessUserId"].trim();
                                     element = element + " by " + userId;
                                 }
                                 return element + "'/>";
                             }                         },
                     "searchable": false,
                     "sortable": true
                 },                            
              {
                  "targets": 3,
                  "render": function (data, type, row) {
                      return "<a class='btn btn-default' role='button' href=\"@Url.Action(MyOtherAction, MyController)?userId=" + row["UserId"] + "\">View Details</a>"
                  },
                  "searchable": false,
                  "sortable": false
              }
          ]           
      });
}

这就是UI上的样子:

enter image description here

这里是Process对象的定义:

enter image description here

我试图将数据排序和数据顺序HTML5属性动态添加到我的render语句中,但似乎没有做任何事情。这会将这些属性添加到图像本身,这可能对排序无效。

我还试图使用createCell回调函数,如下所示,并且根本不用,我不会放在那里。在我的例子中,作为一个快速测试,我试图向所有单元格添加内容。我一无所获。

"createdCell": function (cell, cellData, rowData, rowIndex, colIndex) {
              $(cell).attr('data-userId', 'adsfadsasfas');} 

为了确保这是按预期工作,我插入了一个createRow函数,以确保。我以前一直在使用它,所以我知道工作时应该是什么样子。作品。 Boooyah!

 "createdRow": function (row, data, index) {
              $(row).attr('data-userId', 'fadsafasdfdasfasfasa');           }

这里的输出显示createdRow函数正在工作,但创建的Cell没有任何内容。

enter image description here

那么,我做错了什么,如何添加我想要的排序属性(Process.Id),无论实际显示的是什么?我可以在Column定义中添加sort属性吗?我见过类似的东西,但我不确定。任何帮助表示赞赏!如果上述说明中有任何必要的说明,请与我们联系。

1 个答案:

答案 0 :(得分:1)

我缺少的问题是RENDER函数(无论是在Column还是ColumnDefs中)可以多次调用,具体取决于TYPE(排序,显示,类型)。在RENDER函数中,我需要添加逻辑,该逻辑返回我所呈现的给定类型所需的值。当我想要自定义排序值(Id,而不是自定义图像标签)时,请确保我有渲染SORT类型的逻辑(我想,TYPE =&#39; type&#39;)。否则,渲染我需要的自定义IMG。容易,对吧?

这里是正确处理排序和显示的新代码。检查类型并做你需要的......

 {
                     "targets": 1,
                     "render":
                         function (data, type, row) {
                             var element = "<img id='status_" + row["UserId"] + "' src='" + data["ImageUrl"] + "' title='" + data["Description"] + "";

                             if (type === "sort" || type === 'type') {
                                 return data["Id"];
                             }
                             else {
                                 if (data["Id"] == "2") // add in-process name
                                 {
                                     var userId = row["ProcessUserId"].trim();
                                     element = element + " by " + userId;
                                 }
                                 return element + "'/>";
                             }
                         },
                     "searchable": false,
                     "sortable": true,
                 },