0

我在 Http.context 中存储了一个模型列表,然后我无法在视图中循环遍历它。

索引操作:

@With(MembershipAction.class)
public static Result index() {
...

动作组成:

public class MembershipAction extends Action.Simple {
@Override
public Result call(Context ctx) throws Throwable {

    Member member = Membership.getUser();
    if (member != null) {
        // MGroup.findInvolving(member)= List<play.db.ebean.Model> 
        // code : find.where().eq("members.id", member.id).findList();
        ctx.args.put("groups", MGroup.findInvolving(member));
    }
    return delegate.call(ctx);
}
}

模板视图#1:

@ctx().args.get("groups")

输出:BeanList size[6] hasMoreRows[false] list[models.MGroup@51, models.MGroup@3d, models.MGroup@2a, models.MGroup@29, models.MGroup@15, models.MGroup@1]

模板视图#2(不工作):

@for(group <- ctx().args.get("groups") ){
    @group.name
}

输出:编译错误/值映射不是对象的成员

注意:此处描述的方法也不起作用:如何避免在 play2 中到处传递参数?

尝试片段“@Menus”是未知的......

4

1 回答 1

0

ctx().args为您提供字符串到对象的映射。所以当你从这张地图中得到一些东西时,它的类型是Object. 我认为你的模板编译失败是因为你试图循环一个对象。

解决此问题的最快方法是在模板中执行强制转换:

@for(group <- ctx().args.get("groups").asInstanceOf[List[models.MGroup]]) {
  @group.name
}

在我看来,更好的解决办法是:

  1. 更改模板 #2 以将模型对象列表作为输入参数。查看 Play 文档中的模板语法,特别是如何定义模板输入参数。
  2. 更改呈现此模板的 Java 操作,以从 Java 领域的 HTTP 上下文中获取模型对象列表,并在呈现时将它们传递给模板(在进行一些空值检查和类型检查之后)。

这样,代码对于不在上下文中的数据更加健壮,并且您还可以在模板中维护类型安全。由于列表将作为输入参数输入到您的模板中,因此您无需查看ctx().args模板,因此您无需执行强制转换。

于 2013-08-24T15:24:54.613 回答