如何在 Play 框架中将字典对象从 AJAX 传递到控制器类

how to pass dictionary object from ajax to controller class in play framework

本文关键字:AJAX 控制器 对象 字典 Play 框架      更新时间:2024-01-24

我的视图页面中有dynatree,我想在每次拖放操作时保存树的当前状态,问题是我无法将该dict对象传递给控制器。ajax 的代码如下:

 onDrop: function(node, sourceNode, hitMode, ui, draggable) {
        /** This function MUST be defined to enable dropping of items on
         * the tree.
         */
        logMsg("tree.onDrop(%o, %o, %s)", node, sourceNode, hitMode);
        sourceNode.move(node, hitMode);
        //save state to backend
     var currentTree = $("#tree").dynatree("getTree").toDict();
            $.post("/Application.java", { recieved: currentTree},
               function(data) {
                 $("#output").html(data);
             });

         //expand the drop target
        sourceNode.expand(true);
      },

我用java编写了一个获取该字典对象的方法。但它在路由文件中给了我错误。错误:未找到:在此行中键入字典

POST/hello/:d ict controllers.Application.check(dict:Dictionary(

你的代码中有很多问题。

首先,对于主要问题,routes文件无法编译,因为它确实知道您的类Dictionary。所以你必须告诉文件这个类(包+类(的限定名:

POST /hello/:dict controllers.Application.check(dict:package.to.Dictionary)

但是 AFAIK,它也可能不起作用,因为 Url ( dict ( 的动态部分应该可以在 URL 中打印,因为,您必须调用 URL 并将您的字典编码到其中。让我们说:/hello/thisIsMyDict

因此,最好的选择是删除路由文件中 URL 的动态部分:

POST /hello/ controllers.Application.check()

然后,在您的操作中,使用 DynamicForm 获取正文参数,例如:

public static Result check() {
   DynamicForm myForm = form().bindFromRequest();
   String dict = myForm.get("recieved");
   // convert the string to your Dictionary object
   ...
}

最后,你的javascript代码应该看起来像这样:

var currentTree = $("#tree").dynatree("getTree").toDict();
$.post("@controllers.routes.Application.check()", { recieved: currentTree},
     function(data) {
        $("#output").html(data);
     });