【问题标题】:Play Framework: Controller action runs every loadPlay Framework:控制器动作在每次加载时运行
【发布时间】:2013-07-03 05:00:26
【问题描述】:

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

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

中的 javascript
<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 函数运行。

有人吗?

【问题讨论】:

  • 问题是为什么generateExcel(List&lt;Infoobject&gt; list) 会运行每个页面加载。所以我不明白你的答案。
  • 不,抱歉解释不好。即使我不单击按钮,也会创建文件 "mydata.xls"。每次我进入可交付成果网站时都会创建它。
  • 我已经在我的 Javascript 函数中尝试了 @controllers.Application.generateExcel(currentPage);,但即使我不点击按钮,它仍在创建文件。啊啊啊!

标签: java javascript playframework


【解决方案1】:

一点解释:

在你的 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 个字符

该怎么做

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

【讨论】:

  • 感谢您的解释。您建议的路由代码不起作用(我不得不尝试,即使这听起来是一个糟糕的解决方案)(thing: List&lt;path.InfoObject&gt; list) 错误:“)' expected but thing: List[path.InfoObject] list 错误:“)' expected but l' 找到”...thing: List[path.InfoObject] 错误:“未找到:值路径”...没有进一步的想法。我会尝试 POST 解决方案。
  • 不 那不太对...也许我们可以帮助您?真正的问题是这是如何产生的?是静态数据吗?是用户填写的表格吗?
  • "currentPage" 是一个“信息对象”列表。在可交付成果网站上,有一个表格显示此列表。 Infoobject 有名称、描述、id 等。有一个“导出到 Excel”按钮,当我单击它时,我想生成一个 Excel 文件。为什么不能像...Button>OnClick>Generate File 这样简单?为什么我必须在 POST/GET 中这样做?
  • 在路由中尝试这个而不是thing: java.util.List&lt;models.InfoObject&gt;(如果 InfoObject 包含在模型包中,否则无论它在什么包中)
  • 我的猜测是路由不支持通用 T-Lists.. 你可以只使用 java.util.List 但然后在你的控制器中使用 generateExcel(List l) {List&lt;Infoobject&gt; list=(List&lt;Infoobject&gt;) l;....
【解决方案2】:

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

<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 中,因此框架会告诉您将对象(列表)转换为字符串(使用 QueryStringBinder)。

【讨论】:

  • 编辑了我的答案,以回应下面的讨论
【解决方案3】:

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

How to send a file to browser for downloading?

How to download a file with Play Framework 2.0

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多