Play Framework:Controller操作运行每个负载

时间:2013-07-05 07:04:42

标签: java javascript playframework

有没有人知道为什么每次重新加载页面时我的操作都会运行。我有一个带有按钮的页面,当我点击它时它应该运行。但现在它似乎在我加载页面时运行。

这是我的按钮和文件中的javascript deliverables.scala.html

<input type="button" class="btn success" id="add" value="Export to Excel" onclick="JavaScript:generateExcelClick()" />

<script>
function generateExcelClick(event)
{
   window.location = "@Application.generateExcel(currentPage)";
}
</script>

我的控制员:

public static void generateExcel(List<Infoobject> list) {
    ...creating a file (works)
    ...No return
}

如何更改此代码,以便仅在我点击按钮时运行?该操作不应该呈现另一个页面或类似的东西。我只想生成一个文件。

谢谢!

修改

我试过@ controllers.Application.generateExcel(currentPage);和@Application.generateExcel(currentPage);在我的Javascript函数中,即使我没有单击按钮,它仍然在创建文件。

我还检查了@Application.generateExcel(currentPage);不会从另一个网站och函数运行。

有人,拜托?

3 个答案:

答案 0 :(得分:1)

一点解释:

在您的Scala视图中书写时,您说

@Application.generateExcel(currentPage)

它在控制器generateExcel

中运行函数Application

怎么做

您不希望它立即运行该功能。你希望它去那里onClick

所以使用

@routes.Application.generateExcel(currentPage)

这会输出指向该功能的链接

然而,为了实现这一点,必须在routes

中指向该功能的(GET)链接

将此添加到路线

GET  /whatever/:thing                 controllers.Application.generateExcel(thing: List<path.InfoObject> list)

<强>无论其

这是一个坏主意。为什么? 因为将整个列表放在URL中并不好。

  1. 您是否曾在网址中看到过复杂的列表
  2. 网址必须少于2000个字符
  3. 该怎么做INSTEAD

    将列表作为POST数据发送。根据您收集数据的方式,您必须弄清楚

答案 1 :(得分:1)

如果您在单击按钮时尝试只调用控制器,则可以尝试:

<a href="@routes.YourController.YourMethod(args)"><button>Mybutton</button></a>

我认为你不需要javascript(如果我了解你的情况)。

编辑:这个答案的想法是说你网页中的javascript越少越好。

Edit2:无法评论下面的讨论,所以我把它放在这里: 正如我在这里所说:link,你必须像这样声明你的对象:

controllers.Application.method(list : java.util.List[your.package.Infoobject])

your.package替换为您的对象所在的包(可能是models

但是你会得到一个错误:No QueryString binder found for type

这是因为你只能将字符串和数字放在URLS中,所以框架会告诉你在String中使用QueryStringBinder转换你的Object(List)。

答案 2 :(得分:0)

我会打电话给路线 - &gt; / generateExcelReport来自按钮/链接并使其返回文件

How to send a file to browser for downloading?

How to download a file with Play Framework 2.0