【问题标题】:java Play! framework: passing parameter view with datatable to controller returns null爪哇玩!框架:将带有数据表的参数视图传递给控制器​​返回 null
【发布时间】:2015-03-10 16:40:02
【问题描述】:

我正在开发一个带有 java play 的网络应用程序!框架,在特定视图中,我使用 DataTable 来显示客户列表,我需要将名称列作为链接​​,点击它应该显示客户表。

我的问题是这个 sn-p:

"fnRowCallback": function( nRow, aData, iDisplayIndex ) {
    $('td:eq(0)', nRow).html(
   '<a href="@routes.Dashboard.dettagliCliente("'+aData[3]+'")">'+aData[0] + '</a>'); 
      return nRow;
 }

当应用程序运行时,我单击给定的客户,视图到达控制器,但它没有将 aData[3] 的值传递给方法,而是按字面意思传递字符串“aData[3]”

这是具体路线:

GET  /dashboard/dettagli_cliente/:idCliente controllers.Dashboard.dettagliCliente(idCliente:String)

这是控制器:

public static Result dettagliCliente(String id){
        Logger.info("CUSTOMER ID "+id);
        final Cliente cliente = Cliente.findById(id);
        Form<Cliente> formCliente = Form.form(Cliente.class).bindFromRequest();     
        Form<Cliente> filledForm = formCliente.fill(cliente);
        return ok(registra_utente_form.render(User.findByEmail(request().username()),filledForm,cliente));
    }

更新: 这是视图上完整的 dataTable 调用:

$(document).ready(function() {
$('#clienti_table').DataTable( {
     "processing": true,
     "serverSide": true,
  "ajax": "@routes.Dashboard.testList()",
  "fnRowCallback": function( nRow, aData, iDisplayIndex ) {      
      $('td:eq(0)', nRow).html('<a href="@routes.Dashboard.dettagliCliente("'+aData[3]+'")">'+aData[0] + '</a>');   
   return nRow;
  },
  });  
 });

如果我在 href 属性内写了一个示例客户 ID 而不是 aData[3],它会起作用:单击其中一个客户列表元素,它会打开该给定客户(ID)的详细信息 这是一个例子:

$(document).ready(function() {
$('#clienti_table').DataTable( {
     "processing": true,
     "serverSide": true,
  "ajax": "@routes.Dashboard.testList()",
  "fnRowCallback": function( nRow, aData, iDisplayIndex ) {      
      $('td:eq(0)', nRow).html('<a href="@routes.Dashboard.dettagliCliente("c0ed22dc-6c92-4a70-ad30-ea73e8b0c314")">'+aData[0] + '</a>');   
   return nRow;
  },
    });  

 });

谢谢大家

【问题讨论】:

    标签: java playframework


    【解决方案1】:

    在这种情况下你需要使用Javascript Routing

    由于 scala 模板在调用任何 document.ready js 函数之前首先被编译,并在最终生成的视图中生成一个 url 来代替 @routes.Dashboard.dettagliCliente(),因此无论您在使用 @routes.Dashboard.dettagliCliente() 时输入的参数都将按原样使用.因此在

    案例1:用于传递javascript变量

    @routes.Dashboard.dettagliCliente("'+aData[3]+'")

    生成网址

    /dashboard/dettagli_cliente/'+aData[3]+'

    案例2:直接传递变量

    @routes.Dashboard.dettagliCliente("data")

    生成网址

    /dashboard/dettagli_cliente/data

    所以在您的情况 2 中,生成的 url 是正确的,因此可以正常工作。

    而ufcorse你可以使用直接链接/dashboard/dettagli_cliente/data代替@routes...这样直接生成链接,无需任何转换。

    同时检查Similar

    【讨论】:

    • @VincentArthurvanSchop 我的荣幸
    【解决方案2】:

    它不能这样工作,因为 Play 的路线在到达客户端之前很久很久就被渲染了......

    要正确处理它,您需要使用 other answer 和/或 the docs 中描述的 JavaScript 路由,或者只需将正确的 URL 创建为字符串

    var url = '<a href="/dashboard/dettagli_cliente/'+aData[3]+'">'+aData[0]+'</a>';
    

    更多细节

    @routes 总是在视图渲染期间渲染,这意味着在 服务器端,因此它是远程机器,它会格式化模板并将其感知到您,JavaScript 是 客户端 strong> - 你的浏览器。

    如果在渲染视图的过程中没有给定参数,它将被渲染为空值。服务器对您的客户端脚本一无所知:它不会从您的浏览器窗口读取任何内容。

    可以和普通的纸质报纸相比,印刷厂印刷的时候只有他们现在知道的这些数据,如果你买报纸带回家当然可以拿一支铅笔,改一下里面的文字,但是print house没法远程改。。。

    最后好消息是,我一开始给你的上述解决方案可以让你解决这个问题,刚才提到的 JavaScript 路由 技术准备了你的“JavaScript 版本”路由,所以你也可以在客户端准备有效的链接......

    【讨论】:

    • 感谢您的回答!你能解释一下为什么如果我用一个实际的客户 ID 替换我的代码中的“aData [3]”它可以工作(它为每个客户打开相同的客户详细信息,即我指定 ID 的那个)但我不能以动态方式检索 id...基本上在我的 DataTable 中,aData[3] 列包含客户 ID。谢谢
    • 显示第二个案例
    • 嗨,我已经编辑了这个问题,最后一个例子是关于第二种情况的。谢谢
    • 检查我的编辑,顺便说一句,您应该在浏览器中检查您的 HTML 代码,以了解为什么它是 null
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2018-05-01
    • 1970-01-01
    • 1970-01-01
    • 2020-11-12
    • 1970-01-01
    相关资源
    最近更新 更多