DataTables无法读取未定义的属性“长度”

时间:2014-03-18 04:29:22

标签: javascript jquery asp.net datatables jquery-datatables

以下是文档就绪功能

Script type="text/javascript" charset="utf-8">
    $(document).ready(function () {
        $('#example').dataTable({
            "bProcessing": true,
            "bServerSide": true,
            "sAjaxSource": "GetUser.ashx",
            "sServerMethod": "POST",
            "sAjaxDataProp" : "",
            "aoColumnDefs": [ {
            "aTargets": [ 0 ],
            "mData": "download_link",
            "mRender": function ( data, type, full ) {
               return '<a href="/UserDetail.aspx?ID='+data+'">Detail</a>';
             }
           } ],
            "aoColumns": [
                { "mData": "LoginId" },
                { "mData": "Name" },
                { "mData": "CreatedDate" }
            ]
        });

以下是服务器响应(GetUser.ashx)

[
    {
        "UserId": "1",
        "LoginId": "white.smith",
        "Activated": "Y",
        "Name": "Test Account",
        "LastName": "Liu",
        "Email": "white.smith@logical.com",
        "CreatedDate": "1/21/2014 12:03:00 PM",
        "EntityState": "2",
        "EntityKey": "System.Data.EntityKey"
    },
More Data...
]

下面是应该放置数据的html表

<table cellpadding="0" cellspacing="0" border="0" class="display" id="example">
    <thead>
        <tr>
             <th width="15%">User Detail</th>
            <th width="15%">LoginID</th>
            <th width="15%">Name</th>
            <th width="15%">Created Date</th>
        </tr>
    </thead>
    <tbody>
        <tr>
            <td colspan="5" class="dataTables_empty">Loading data from server</td>
        </tr>
    </tbody>
    <tfoot>
        <tr>
             <th width="15%">User Detail</th>
            <th width="15%">LoginID</th>
            <th width="15%">Name</th>
            <th width="15%">Created Date</th>
        </tr>
    </tfoot>
</table>

预期结果:

enter image description here

但我遇到了一个问题:

在加载页面时,浏览器出现了未捕获的异常:

Cannot read property 'length' of undefined 

当我进一步检查时,它来自jquery.dataTables.js的第2037行

var aData = _fnGetObjectDataFn( oSettings.sAjaxDataProp )( json );

enter image description here

我检查过json是有效的,但&#34; aData&#34;为什么会发生这种情况?

5 个答案:

答案 0 :(得分:9)

您的"sAjaxDataProp" : ""设置为空字符串,这会导致此错误。

dataTables期望在这里有一个字符串来告诉你服务器返回数据的哪个键可以找到。 这默认为aaData,因此你的json应该在分页等可能返回或需要的所有其他内容中包含此密钥。

正常服务器json:

{
"iTotalRecords":"6",
"iTotalDisplayRecords":"6",
"aaData": [
    [
        "1",
        "sameek",
        "sam",
        "sam",
        "sameek@test.com",
        "1",
        ""
    ],...

由于所有值都在aaData中,因此您根本不需要sAjaxDataProp。

修改了serverside json:

{
"iTotalRecords":"6",
"iTotalDisplayRecords":"6",
"myData": [
    [
        "1",
        "sameek",
        "sam",
        "sam",
        "sameek@test.com",
        "1",
        ""
    ],

现在值在myData中。所以你需要通过设置告诉dataTables在哪里找到实际数据:

"sAjaxDataProp" : "myData"

这是Plunker

答案 1 :(得分:6)

由于有4列,请在“aoColumns”中添加以下内容:

"aoColumns": [
  { "mData": null },  // for User Detail
  { "mData": "LoginId" },
  { "mData": "Name" },
  { "mData": "CreatedDate" }
]

对于未定义的长度,我尝试了以下代码并且它正在运行:

$('#example').dataTable({
 "aLengthMenu": [[100, 200, 300], [100, 200, 300]],
  "iDisplayLength": 100,
  "iDisplayStart" : 0,
  "bProcessing": true,
  "bServerSide": true,
  "sAjaxSource": "GetUser.ashx",
  "sServerMethod": "POST",
  "sAjaxDataProp" : "",
  "aoColumnDefs": [ {
    "aTargets": [ 0 ],
    "mData": "download_link",
    "mRender": function ( data, type, full ) {
      return '<a href="/UserDetail.aspx?ID='+data+'">Detail</a>';
    }
  } ],
  "aoColumns": [
    { "mData": null },
    { "mData": "LoginId" },
    { "mData": "Name" },
    { "mData": "CreatedDate" }
  ]
});

了解aLengthMenu的更多信息的参考网站是:

https://legacy.datatables.net/ref#aLengthMenu

答案 2 :(得分:3)

如果您看到此错误,请查看从服务器返回的json,然后确保所有数据表&#39; mData&#39;值具有匹配的条目。如果您还在使用bean,请在那里查看。

并且无需为表格指定&#39; tr&#39;,&#39; td&#39;等。如果你让jquery为你做这件事,那就更清洁了。这是我的表格的样子:

<table cellpadding="0" cellspacing="0" border="0" class="display" id="myTable" style="table-layout:fixed" ></table>

然后我的datatable元素指定宽度和列标题:

{sTitle: "Column A", sWidth: "100px", mData: "idStringFromJson", bSortable: false},

答案 3 :(得分:0)

使用$('#example').DataTable({..(大写字母D)代替$('#example').dataTable({..

答案 4 :(得分:0)

当我遇到这个问题时,实际上是未应用迁移的结果。我已经恢复了数据库的备份,该数据库尚未运行我最近的一次模式迁移,一旦我运行迁移,一切正常。