0

谁能给我一个简单表格的例子,当给定一个简单的对象时,您可以点击保存并知道它具有保存对象所需的所有数据(包括id?)

使用在这里找到的剧本

(这只是一个占位符,所以我可以发布答案 - 为什么没有人喜欢给出在他们的框架中工作的例子?叹息)

4

1 回答 1

0

这不是我想要的那么明显 - 我来自你在表格中“隐藏” id 的学校,在某种隐藏字段或类似的地方。

也许 play-bootstrap 代码库有一些不错的方法,但我没有在文档中看到它 - 所以,我的朋友,这里是如何获取一些对象,为它制作一个表格然后能够更新它对象文本。

为简洁起见,我将数据库代码省略了。

首先,这是我的操作 - 在我的控制器类中 - 从数据库中获取我的模型。请注意,我使用的支持模型与数据库返回的支持模型相同,带有私有字段等(所以,你知道,只是一个通用的 POJO)。

public Result editLesson(int languageId){
    Form<Language> languageForm = formFactory.form(Language.class);

    try {
        //here da is just how i get things from the database.
        Language language = da.getLanguage(languageId);
        languageForm = languageForm.fill(language);
    } catch (SQLException e){ //SAD! } 
    return ok(editLesson.render(languageForm));
}

整洁的。这样就可以获取表单并将其发送到某个页面以查看。请注意,formFactory 需要神奇地注入到您的控制器中。接下来,页面是什么样的?

好吧,这是一个常用的模板,只有:

我有这个作为我的第一行:@import b3.vertical.fieldConstructor

我想在哪里展示我的表格

@b3.form(routes.HomeController.saveLesson) {
    @b3.hidden( "id", languageForm("id").value, 'attr -> false )
    @b3.text( languageForm("name"), '_label -> "Title", 'placeholder -> "The Title" )
    @b3.text( languageForm("description"), '_label -> "Description", 'placeholder -> "The Description" )
    @b3.submit('class -> "btn btn-default"){ <span class="glyphicon glyphicon-ok"></span> Save }
}

好的,现在我们有了表单——它告诉表单去哪里(我们将在 5 秒内查看路线),并放置可编辑字段。我在这里将 id 字段设置为隐藏。如何访问它对我来说并不直观——但你就在那里。

我的路线文件有这个:

GET     /edit-lesson/:languageId    controllers.HomeController.editLesson(languageId: Integer)
POST    /save-lesson/               controllers.HomeController.saveLesson()

第一行是我如何开始编辑页面。第二行是我想保存这些编辑过的课程的地方。我使用routes.HomeController.saveLessonto 反向指向保存课程。如果您的控制器称为 Bob(哑名称),您将改为使用routes.Bob.saveLesson链接到该saveLesson方法。

最后,我的 saveLesson 代码如下所示(在 Bob ~ erm, HomeController 中)

public Result saveLesson(){
    Form<Language> languageForm = formFactory.form(Language.class).bindFromRequest();

    if (languageForm.hasErrors()){
        return badRequest(editLesson.render(languageForm));
    } else {
        Language language = languageForm.get();
        try {
            da.saveLanguage(language);
            return ok(share.render());
        } catch (SQLException e){
            //TODO: log this, but really we don't have much to do, do we?
            return ok(e.getMessage());
        }
    }
}

注意数据绑定在 Play 中搞砸了——如果你的表单有错误,调用.get()将失败,所以如果在你的控制器中你出于某种原因需要一些表单数据,你需要检查表单是否有错误——如果它不,随便。如果是这样,您需要.field(String).value()在表单对象上使用,您无法将表单对象转换为绑定(通过get())~这在 scala 页面上有所解释,但在 java 页面上没有!

于 2016-12-31T17:18:29.787 回答