繁体   English   中英

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

[英]Play Framework: Controller action runs every load

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

这是我的按钮和javascript文件deliverrables.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函数运行。

有人,拜托?

一点解释:

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

@Application.generateExcel(currentPage)

它在控制器Application运行generateExcel函数

该怎么办

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

所以使用

@routes.Application.generateExcel(currentPage)

这会输出该功能的链接

但是要使其工作,必须在您的routes有一个(GET)链接到该功能

将其添加到路线

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

然而

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

  1. 您是否曾在URL中看到过复杂的列表
  2. 网址必须少于2000个字符

怎么做INSTEAD

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

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

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

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

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

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

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

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

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

这是因为您只能在URL中放置字符串和数字,因此框架会告诉您在String(使用QueryStringBinder)中转换Object(List)。

我将从按钮/链接调用routes-> / generateExcelReport并使其返回文件

如何将文件发送到浏览器进行下载?

如何使用Play Framework 2.0下载文件

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM