web-dev-qa-db-fra.com

Erreur DataTables: "Paramètre inconnu demandé"

Je suis nouveau dans le plugin jquery DataTables. Après avoir découvert que IE 8 avait des problèmes de performances avec Javascript, j'ai décidé de changer la façon dont j'utilise DataTables pour effectuer le traitement côté serveur. J'obtiens ce message d'erreur lorsque mon JSP se charge (j'utilise Printemps 3):

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

J'ai cherché sur Google et constaté que de nombreuses causes de ce message d'erreur se résumaient à un JSON malformé.J'ai donc trouvé un moyen de sortir mon JSON à partir de ma fonction de contrôleur Spring 3 pour jeter un œil au JSON qu'il crée et j'ai changé mon code pour le faire être assez proche de ce à quoi le site DataTables dit qu'il devrait ressembler.

Toujours pas de joie, toujours ce message d'erreur.

Les exemples de traitement côté serveur que j'ai trouvés pour DataTables n'incluaient pas de code pour spécifier les colonnes utilisées côté client, j'ai donc supposé que je n'en avais pas besoin. Est ce que je?

Voici les parties pertinentes de mes résultats.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>

Voici la réponse JSON que je lui ai envoyée:

{
  "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"
  } ]
}

Voici ma fonction de contrôleur Spring que j'utilise pour envoyer la réponse JSON via Jackson. Cela inclut du code pour sortir mon JSON afin que je puisse voir à quoi il ressemble. Le JSON qu'il sort sur stdout et ce que je renvoie à DataTables peut-il être différent?

@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

J'avais ce même problème ce matin. Vous devez avoir le paramètre aoColumns et utiliser mDataProp Comme dans ceci:

https://Gist.github.com/1660712

Au moins, cela a résolu mon problème.

13
bah

J'ai également rencontré le même avertissement, mais la cause était différente. J'avais null valeurs dans mes données. Le format JSON était correct, mais DataTables ne sait pas avoir de règle par défaut pour afficher nulls. La solution consistait à utiliser la propriété sDefaultContent.

Exemple aaData:

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

Et puis sur les aoColumns, vous pouvez utiliser la propriété comme suit:

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

Ce n'est pas votre problème actuel, mais vous pouvez rencontrer ce problème à l'avenir.

J'espère que cela vous a été utile.

37
joshgo

l'option sDefaultContent empêche l'affichage des boîtes d'alerte uniquement. Les tableaux de données ne trouveront pas la règle d'affichage des valeurs nulles.

La modification des valeurs nulles dans le tableau éliminera cet avertissement.

2
Swetha

Pour éviter cette erreur, votre numéro de table de colonnes "th" doit être égal au retour des colonnes de données (en nombre), dans le problème ci-dessus, il s'agit de aaData.

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

Il s'agit du format correct pour renvoyer les données de la langue côté serveur. J'ai résolu mon problème de la même manière.

1
Mohammad Zeshan

Si cela aide quelqu'un, j'ai eu une erreur similaire parce que j'avais des points dans mon nom de fonction mRender:
My.Namespace.MyFunction(data, row);

Cette ligne:
var a = _fnSplitObjNotation( src );

Divise cela en objets séparés, ce qui génère évidemment une erreur.

En utilisant

My_Namespace_MyFunction(data, row);

De plus, j'ai remarqué cette erreur lors du passage d'un nom de fonction de chaîne au lieu de l'objet de fonction JavaScript.

1
abbaf33f