这是我的测试设置:
该模型:
package models;
import javax.persistence.Entity;
import play.db.jpa.Model;
@Entity
public class Item extends Model {
public String propertyA;
public String propertyB;
public String getFullName() {
return this.propertyA + " - " + this.propertyB;
}
}
Run Code Online (Sandbox Code Playgroud)
控制器:
package controllers;
import play.*;
import play.mvc.*;
import java.util.*;
import models.*;
public class Application extends Controller {
public static void index() {
List<Item> allItems = Item.findAll();
render(allItems);
}
public static void save(List<Item> items) {
if (items == null) {
Logger.info("no items");
} else {
for (Item item : items) {
Logger.info("item: %s",item);
}
Logger.info("-------");
}
index();
}
}
Run Code Online (Sandbox Code Playgroud)
风景:
#{extends 'main.html' /}
#{set title:'Home' /}
#{form @Application.save()}
Select Items:
<div>
<select name="items" style="width: 200px;" multiple="multiple" size="10">
#{list items:allItems, as: 'item'}
<option value=${item.id} >${item.fullName}</option>
#{/list}
</select>
</div>
<input type="submit" value="Save" />
#{/form}
Run Code Online (Sandbox Code Playgroud)
当我在选择框中选择两个项目时,我得到以下日志输出:
06:22:20,560 INFO ~ -------
06:22:26,991 INFO ~ item: null
06:22:26,991 INFO ~ item: null
Run Code Online (Sandbox Code Playgroud)
看起来 play 将选择映射到null对象列表。即使我将视图更改为:
<option value=${item} >${item.fullName}</option>
Run Code Online (Sandbox Code Playgroud)
我得到null值。
但是当我将控制器更改为:
public static void save(List<Long> items) {
...
}
Run Code Online (Sandbox Code Playgroud)
我至少得到了一个正确 Id 的列表。
我该如何改变这一点,以便 play 为我的物品创建正确的映射。我更喜欢 getList<Item>而不是List<Long>(在这里我必须执行查询以获取项目列表)。
BR, 雷内
更新:
如果我运行:
curl -d "items[0].id=3&items[0].propertyA=bla&items[0].propertyB=blo&items[1].id=4" http://localhost:9000/application/save
Run Code Online (Sandbox Code Playgroud)
Wich 使用上述参数执行 POST,我得到:
A02:39:53,072 INFO ~ item: bla - blo
02:39:53,072 INFO ~ item: null - null
02:39:53,072 INFO ~ -------
Run Code Online (Sandbox Code Playgroud)
像这样它可以工作,但我不知道如何更改视图,以便它发布上述参数:-(
更新 2:
在 Felipe 的帮助下,我开始使用它。必须添加此控制器方法:
@Before(only = {"save"})
static void parseParams() {
String[] items = params.getAll("items");
params.remove("items");
for (int i = 0; i < items.length; i++) {
Item item = Item.findById(Long.parseLong(items[i]));
params.put("items[" + i + "].id", items[i]);
params.put("items[" + i + "].propertyA", item.propertyA);
params.put("items[" + i + "].propertyB", item.propertyB);
}
}
Run Code Online (Sandbox Code Playgroud)
这是一个绑定问题,play 没有绑定它接收到的 long[] 参数。
从游戏的文档中获取:http://www.playframework.org/documentation/1.2.3/controllers#objectbinding
您需要将选择的名称更改为items.id
它可能不起作用,因为 play 期望列表的索引为items[i].id...
无论如何,如果这不能解决您的问题,您可以进行自定义绑定,但是当您在很多地方需要此绑定时,该选项通常都很好,如果您只执行一次,则没有理由不要按照您在帖子末尾所说的那样进行查询。(Play 将使用此查询来执行此绑定,因此您自己执行此操作不会丢失或赢得任何性能)
更新 一些内容:
@Before(only={"save"})
static void parseParams() {
String[] itens = params.getAll("items")
for (int i=0;i<itens.length;i++) {
params.put("items["+i+"].id",itens[i])
}
}
Run Code Online (Sandbox Code Playgroud)
应该管用。
另一种方法是 javascript,但它更难且更容易出现错误。
| 归档时间: |
|
| 查看次数: |
7542 次 |
| 最近记录: |