繁体   English   中英

在Play框架中将对象列表从视图传递到Controller

[英]Passing a List of objects from view to Controller in play framework

在我的play(FOR JAVA)应用程序中,我有一个对象列表(java.util.List),该对象列表将传递给视图并显示给用户。 然后,用户可以删除列表中的某些对象,也可以不删除,然后,我想将编辑后的列表传递回Controller,但是我不能做最后一部分(从视图到控制器的传递)。

因为我的清单可能很大,所以我不想用GET来做(GET也很不安全?!),也不知道如何用POST来做(或者还有其他解决方案吗?)

因此,如果我能对此有所帮助,那就太好了。

我列表中的对象就是这种类型的:

public class CalObj {

   private String pdfFileName;
   private String serialNo;
   private Date calDate;
   private Device device;
}

更新:谢谢@biesior,我的View(calExtractionResults.scala.html)现在看起来像这样:

    @for(calObj <- calObjList) {
      <tr>
        <td> @calObj.getPdfFileName</td>
        <td> @calObj.getSerialNo</td>
        <td> @calObj.getDevice.name</td>
        <td> @calObj.getDevice.calDateToString()</td>
        <td> @calObj.getCalDate</td>
        <td>
            <form action="@DateExtractorContr.updateList(calObjList, calObj)" method="POST">
                <input type="hidden" name="serialNo" value="@calObj.getSerialNo"/>
                <input type="submit" value="Delete"/>
            </form>
        </td>

      </tr>
    }

这是在我的控制器中:

public static Result updateList(List<CalObj> calObjs, CalObj objToDel){
    List<CalObj> newList = calObjs;
    newList.remove(objToDel);
    return ok(calExtractionResults.render(newList));
}

但是当我打开相关页面时,出现了问题:

  1. 使用上面的代码,我得到: [ConcurrentModificationException: null]
  2. 如果我将updateList函数替换为不会导致并发异常的伪函数,则在显示页面之前,程序将通过该伪函数。 我什至没有点击删除按钮。

很简单:

使用@for语句迭代列表,用单独的形式包装每个元素:

@for(item <- yourList) {
    <h1>@item.name</h1>
    <form action="/link/to/delete/action" method="POST">
       <input type="hidden" name="id" value="@item.id"/>
       <input type="submit" value="Delete"/>
    </form>
}

因此,删除项目后,您可以再次重定向到列表视图。

如您所见,您需要一些唯一的ID(也许serialNo在您的情况下保留角色,dunno)。

编辑:当然,您也可以创建一种形式的女巫复选框作为数组,如果要删除许多元素,可以立即发送。

暂无
暂无

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

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