java Play! framework:将带有datatable的参数视图传递给controller,返回null

时间:2015-03-10 16:40:02

标签: java playframework

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

我的问题是这个片段:

"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;
  },
    });  

 });

谢谢大家

2 个答案:

答案 0 :(得分:0)

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

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

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

更多细节

@routes总是在视图渲染过程中渲染,这意味着在服务器端,所以远程机器格式化模板并感知它,JavaScript是客户端 - 您的浏览器。

如果在渲染视图期间没有给出参数,则会使用空值进行渲染。服务器对您的客户端脚本一无所知:它不会从您的浏览器窗口中读取任何内容。

它可以与普通纸报相比,当它在印刷厂印刷时,它只有他们现在知道的这些数据,如果你要买报纸并带到家里,你当然可以拿一支铅笔并更换一些文字,但是印刷厂不可能远程改变它......

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

答案 1 :(得分:0)

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

在调用任何document.ready js函数之前首先编译scala模板,并在最终生成的视图中生成一个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是正确的,所以它有效。

并且您可以使用直接链接/dashboard/dettagli_cliente/data代替@routes...,以便直接生成链接而无需任何转化。

同时检查Similar