【问题标题】:Getting going on play framework - what silly mistake am I making here?开始游戏框架 - 我在这里犯了什么愚蠢的错误?
【发布时间】:2011-11-28 12:08:56
【问题描述】:

所以我开始在 Mongo 中使用 play 框架,但在尝试使用简单的 MVC 模式使某些东西正常工作时遇到了问题。我用这个看不到树木的树木,并且知道解决方案一定很简单。

我有一个定义为实体的用户对象:

package models;

import play.modules.mongo.MongoEntity;
import play.modules.mongo.MongoModel;


@MongoEntity("users")
public class User extends MongoModel
{
    public String username;
    public String email;
    public String password;
}

我有一个控制器,里面有以下两种方法:

package controllers;

import models.User;
import play.mvc.Controller;
import play.Logger;

public class UserController extends Controller 
{
    public static void createUser()
    {
        User user = new User();
        render(user);     
    } 

    public static void insertUser(User iUser)
    {
        Logger.info("Paul 1: " + iUser + " :: " + (iUser ==  null));
    }

}

并且路由定义如下:

POST    /insertUser    UserController.insertUser
GET     /users         UserController.createUser

所以我定义了以下页面视图,当我点击保存时,控制器中的代码告诉我 User 对象为空:

#{extends 'main.html' /}
#{set title:'Create User' /}
<form action="@{UserController.insertUser(user)}" method="POST"/>

    Username: <input type="text" value="${user.username}" /><br/>
    Password: <input type="text" value="${user.password}" /><br/>
    Email: <input type="text" value="${user.email}" /><br/>
    <input type="submit" value="Add User" />
</form>

我已经尝试了很多关于动作的排列,但无法弄清楚为什么它不起作用。有任何想法吗?非常感谢所有帮助,我知道我错过了一些愚蠢的东西,就是这样。

【问题讨论】:

    标签: java mongodb playframework


    【解决方案1】:

    我认为您至少错过了 HTML 论坛输入元素上的 name 属性,Play!将用于将表单值映射到您的控制器参数。请尝试以下操作:

    #{extends 'main.html' /}
    #{set title:'Create User' /}
    <form action="@{UserController.insertUser(user)}" method="POST"/>
        Username: <input type="text" name="user.username" value="${user.username}" /><br/>
        Password: <input type="text" name="user.password" value="${user.password}" /><br/>
        Email: <input type="text" name="user.email" value="${user.email}" /><br/>
        <input type="submit" value="Add User" />
    </form>
    

    或者,您可以使用template #{form} tag 让模板系统为您生成表单。这对于使用您自己的表单交叉检查 #{form} 标记的输出以查看有什么不同也可能很有用。

    更新:您可能还需要删除表单操作属性@{UserController.insertUser(user)} 中的user 参数,这将更像@{UserController.insertUser}

    【讨论】:

    • 遗憾的是,这些建议都不起作用。仍然输出 null :-(
    【解决方案2】:

    解决方案是将 User 类重命名为 UserItem。我希望在 Mongo 或 Play 的某个地方有一个默认的用户类!这碍事了。

    编辑:是的,包括名称映射在解决方案中也很重要,尽管它本身并不能解决问题。我会相应地投票。

    【讨论】:

    • 我假设解决方案是您更改类名和@pHk 的建议,因为他建议在输入标签中使用name 属性,这是唯一的方法播放以将 http 表单项映射到对象。
    猜你喜欢
    • 2020-06-24
    • 1970-01-01
    • 1970-01-01
    • 2023-03-24
    • 1970-01-01
    • 2021-10-17
    • 2017-10-12
    • 1970-01-01
    • 2016-12-09
    相关资源
    最近更新 更多