web-dev-qa-db-ja.com

DataTablesエラー:「不明なパラメーターを要求しました」

DataTables jqueryプラグインは初めてです。 IE 8はJavaScriptでパフォーマンスの問題があったことを発見した後、DataTablesを使用してサーバー側の処理を行う方法を変更することにしました。JSPの読み込み時にこのエラーメッセージが表示されます春3):

DataTables warning (table id = 'results_table'): Requested unknown parameter '0' from the data source for row 0

私はグーグルで調べて、そのエラーメッセージの多くの原因が不正なJSONにあることを発見したので、JSONをSpring 3コントローラ関数から出力して作成するJSONを見る方法を見つけ、それを取得するためにコードを変更しました DataTables のサイトが表示されるべきものにかなり近いこと。

まだ喜びはありませんが、そのエラーメッセージが表示されます。

DataTablesで見つけたサーバー側の処理の例には、クライアント側で使用される列を指定するコードが含まれていなかったため、必要ではないと仮定しました。私は?

ここに私の結果の関連部分があります。jsp:

<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
<html xmlns="http://www.w3.org/1999/xhtml" >

<head>
    <title>ACME: search results in a Nice DataTables.net Plugin</title>
</head>
<body>

<link rel="stylesheet" type="text/css" href="css/jquery.dataTables.css" />
<script language = "JavaScript" type = "text/javascript" src = "../nsd/js/jquery-1.7.js"></script>
<script language = "JavaScript" type = "text/javascript" src = "../nsd/js/jquery.dataTables.js"></script>

<script type="text/javascript">
$(document).ready(function() {
    $('#results_table').dataTable( {
        "bProcessing": true,
        "bServerSide": true,
        "sScrollX": "600px",
        "sServerMethod": "POST",
        "sAjaxSource": "/acme/resultstable",
    } );
} );
</script>


<form id="command" name="f" action="employee" method="post">

    <div id = "results">
        <table id = "results_table">
            <thead>           
                <tr>
                    <th>&nbsp;</th>
                    <th>ID</th>
                    <th>NO_PRINT</th>
                    <th>Full Name</th>
                    <th>Email Address</th>
                    <th>Phone Number</th>
                    <th>Organization</th>
                    <th>Organization Code</th>
                    <th>Position</th>
                    <th>Employee Type</th>
                </tr>
            </thead>
            <tbody>           
            </tbody>
        </table>

    </body>
</html>

ここに私が送ってきたJSONレスポンスがあります:

{
  "sEcho" : 1,
  "iTotalRecords" : 1,
  "iTotalDisplayRecords" : 1,
  "aaData" : [ {
    "person_id" : "888888",
    "ID" : "999999",
    "no_print" : "&nbsp;",
    "fullname" : "Obama, Willard",
    "email_address" : "<a href = \"mailto:[email protected]\">[email protected]</a>",
    "current_phone_number" : "303-867-5309",
    "title" : "&nbsp;",
    "office" : "&nbsp;",
    "position" : "Contractor",
    "empl_code" : "CONT"
  } ]
}

これは、Jackson経由でJSON応答を送信するために使用しているSpringコントローラー関数です。これには、JSONを出力するコードが含まれているため、どのように見えるかを確認できます。 JSONがstdoutに出力するJSONとDataTablesに送り返す内容が異なる可能性はありますか?

@RequestMapping(value = "/resultstable", method = RequestMethod.POST)
public @ResponseBody LinkedHashMap resultstable(ModelMap model,                 
                                                HttpSession session,
                                                @RequestParam (required=true) int sEcho,   
                                                @RequestParam (required=true) int iDisplayStart,   
                                                @RequestParam (required=true) int iDisplayLength,    
                                                @RequestParam (required=true) int iColumns,
                                                @RequestParam (required=true) int iSortCol_0, 
                                                @RequestParam (required=false)String sSortDir_0,
                                                @RequestParam (required=true) String sSearch ) {

    /*
    **********************************************************************
    **  These come from the DataTables.net Jquery plugin on results.jsp
    **********************************************************************
    **  sEcho,          -  just send it back, used by DataTables for synching
    **  iDisplayStart   -  index of the record to start with, ie 3 for the 3rd of 100 records
    **  iDisplayLength  -  number of records to send back starting with iDisplayStart  
    **  iColumns        -  number of columns to be displayed in the table
    **  iSortCol_0      -  the number of thee column to be sorted on
    **  sSortDir_0      -  direction of sorting: asc or desc
    **  sSearch         -  from the search box, filter results further on this term 
    ********************************************************************** 
    */

    String nextView                   = "results";
    String usertype                   = (String)session.getAttribute("usertype");
    Search search                     = new Search(usertype);
    List<LinkedHashMap> records       = null;
    String results                    = null;
    int number_of_records             = (Integer)session.getAttribute("number_of_records_found");
    ResultsView rv                    = new ResultsView();
    ResultsScreenTableHolder rstrh    = null;
    SearchScreenDataHolder ssdh2      = (SearchScreenDataHolder)session.getAttribute("search_screen_data_holder");
    ObjectMapper mapper               = new ObjectMapper();

    logger.debug("started");

    logger.debug("sEcho,         == " + sEcho         );
    logger.debug("iDisplayStart  == " + iDisplayStart  );
    logger.debug("iDisplayLength == " + iDisplayLength );
    logger.debug("iColumns       == " + iColumns       );
    logger.debug("iSortCol_0     == " + iSortCol_0     );
    logger.debug("sSortDir_0     == " + sSortDir_0     );
    logger.debug("sSearch        == " + sSearch        );


    try {
        records = search.searchForAnEmployee(ssdh2,usertype,sSearch,"asc",
                                             iSortCol_0,iDisplayStart, 
                                             iDisplayLength);    


        LinkedHashMap lhm= new Java.util.LinkedHashMap();
        lhm.put("sEcho", sEcho);
        lhm.put("iTotalRecords",number_of_records);
        lhm.put("iTotalDisplayRecords",9);
        lhm.put("aaData",records);

        // convert user object to json string, and save to a file
        mapper.writeValue(new File("c:\\Downloads\\rstrh.json.txt"), lhm);

        // display to console
        logger.debug("My JSON: " + mapper.defaultPrettyPrintingWriter().writeValueAsString(lhm));

    }
    catch (Exception e) {
        logger.debug("\n",e);
    }

    return lhm;       

}// end function 
22
Steve

今朝も同じ問題を抱えていました。 aoColumnsパラメーターが必要であり、次のようにmDataPropを使用する必要があります。

https://Gist.github.com/1660712

少なくとも私の問題は解決しました。

13
bah

私も同じ警告に遭遇しましたが、原因は異なりました。データにnull値がありました。 JSON形式は正しいものでしたが、DataTablesにはnullsを表示するためのデフォルトルールがありません。解決策は、sDefaultContentプロパティを使用することでした。

サンプルaaData:

aaData: [
  { "Field1": "Foo", "Field2":null },
  { "Field1": "Bar", "Field2":null },
]

そして、aoColumnsでは、次のようにプロパティを使用できます。

aoColumns: [
  { "mData": "Field1", sDefaultContent: "n/a" },
  { "mData": "Field2", sDefaultContent: "" }
]

これは現在の問題ではありませんが、将来この問題が発生する可能性があります。

これがお役に立てば幸いです。

37
joshgo

sDefaultContentオプションは、警告ボックスのみを表示しないようにします。データテーブルは、null値を表示するルールを見つけられません。

テーブル内のヌル値を変更すると、この警告はなくなります。

2
Swetha

このエラーを回避するには、「th」列のテーブル番号がデータ列(数値)を返すのと同じである必要があります。上記の問題ではaaDataです。

"aaData" : [ 
  [
   "person_id" : "888888",
   "ID" : "999999",
  ],
  [
   "person_id" : "8888889",
   "ID" : "9999990",
  ]
]

これは、サーバー側の言語からデータを返す正しい形式です。同じ方法で問題を解決しました。

1
Mohammad Zeshan

それが誰かに役立つ場合、mRender関数名にピリオドがあったため、同様のエラーが発生しました:
My.Namespace.MyFunction(data, row);

この行:
var a = _fnSplitObjNotation( src );

それを別々のオブジェクトに分割します。これは明らかにエラーを生成します。

を使用して

My_Namespace_MyFunction(data, row);

さらに、JavaScript関数オブジェクトの代わりに文字列関数名を渡すと、このエラーに気付きました。

1
abbaf33f