为什么 PUT 被发送到 show() 而不是 update()?
Why is PUT sent to show() instead of update()?
这是我的 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()
而不是 update
。
任何人都可以更深入地了解这个问题吗?
问题是浏览器只支持从表单发送 POST 或 GET 请求。如果您查看表单中呈现的 HTML,您会看到它是这样写的:
<form action="/users/1" method="PUT">
但是由于浏览器不支持从表单发起PUT请求,所以浏览器会忽略method参数,默认使用默认方法,即GET。因此浏览器发出 GET 请求,Play 会相应地处理它。
因此您只能使用 POST 或 GET 与 HTML 形式。有变通办法,例如,您可以使用 JavaScript 劫持表单提交,并使用来自表单数据的 AJAX 发出 PUT 请求。
这是我的 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()
而不是 update
。
任何人都可以更深入地了解这个问题吗?
问题是浏览器只支持从表单发送 POST 或 GET 请求。如果您查看表单中呈现的 HTML,您会看到它是这样写的:
<form action="/users/1" method="PUT">
但是由于浏览器不支持从表单发起PUT请求,所以浏览器会忽略method参数,默认使用默认方法,即GET。因此浏览器发出 GET 请求,Play 会相应地处理它。
因此您只能使用 POST 或 GET 与 HTML 形式。有变通办法,例如,您可以使用 JavaScript 劫持表单提交,并使用来自表单数据的 AJAX 发出 PUT 请求。