为什么PUT被发送到show()而不是update()?

时间:2015-01-20 05:07:45

标签: playframework playframework-2.0

这是我的edit()方法:

  public static Result edit(Long id)
  {
    User user = User.findById(id);
    Form<User> form = new Form<User>(User.class).fill(user);

    return ok(edit.render(user, form));
  }

在浏览器中,它会向PUT发送/users/1

这是我的路线简介:

GET     /users/new                  controllers.UsersController.newUser()
POST    /users                      controllers.UsersController.create()
GET     /users/:id                  controllers.UsersController.show(id: Long)
GET     /users/:id/edit             controllers.UsersController.edit(id: Long)
PUT     /users/:id                  controllers.UsersController.update(id: Long)

这是我的表格:

@helper.form(action = routes.UsersController.update(user.id)) {

  @helper.inputText(editUserForm("email"))
  @helper.inputText(editUserForm("username"))
  @helper.inputPassword(editUserForm("password"))

  <button type="submit" name="action" value="update">Update</button>
}

但是,当我访问/users/1/edit并点击更新按钮时,请求将以http://localhost:9000/users/1?email=My+Email&username=My+Username&password=My+Password&action=update而非封装表单数据的形式发送,并由show()代替{{1}处理}}。

任何人都可以提供有关此问题的更多信息吗?

1 个答案:

答案 0 :(得分:0)

问题是浏览器仅支持从表单发送POST或GET请求。如果您查看表单中呈现的HTML,您会看到它的内容如下:

<form action="/users/1" method="PUT">

但是由于浏览器不支持从表单发出PUT请求,浏览器会忽略方法参数,默认为默认方法,即GET。因此,浏览器发出GET请求,Play会相应地处理。

因此,您只能对HTML表单使用POST或GET。有一些解决方法,例如,您可以使用JavaScript来劫持表单提交,并使用表单数据中的AJAX发出PUT请求。