我有编辑订单的表单,但我必须添加按钮以删除订单。现在我有两个提交按钮的表单:
@helper.form(routes.Order.editOrder,'class -> "form-horizontal") {
@helper.inputText(
PlayMagicForJava.javaFieldtoScalaField(editOrderForm("date")),
'_label -> "Date:",
'_help -> ""
)
@helper.inputText(
PlayMagicForJava.javaFieldtoScalaField(editOrderForm("place_from")),
'_label -> "From:",
'_help -> ""
)
<button type="submit" name="edit" id="edit" class="btn btn-primary">Edit Order</button>
<button type="submit" name="remove" id="remove" value="remove" class="btn">Remove order</button>
}
我在控制器中的功能仅用于编辑:
public static Result editOrder(){
Order user = User.findByEmail(session("email"));
Form<Order> editOrderFormFilled = editOrderForm.bindFromRequest();
Order order = Order.findByID(editOrderFormFilled.get().id);
if(editOrderFormFilled.hasErrors()) {
return badRequest();
}
else if(user.id != order.created_by){
return badRequest();
}else{
return OK();
}
}
如何处理提交的按钮?
答案 0 :(得分:18)
所选按钮的value
属性将作为任何其他字段发送到服务器。因此,在您的控制器中,您可以在请求正文中访问此值并决定要执行的操作。
模板:
<button type="submit" name="action" value="edit">Edit order</button>
<button type="submit" name="action" value="remove">Remove order</button>
控制器:
public static Result myAction() {
String[] postAction = request().body().asFormUrlEncoded().get("action");
if (postAction == null || postAction.length == 0) {
return badRequest("You must provide a valid action");
} else {
String action = postAction[0];
if ("edit".equals(action)) {
return edit(request());
} else if ("remove".equals(action)) {
return remove(request());
} else {
return badRequest("This action is not allowed");
}
}
}
private static Result remove(Request request) {
// TODO
return ok("implement your business here");
}
private static Result edit(Request request) {
// TODO
return ok("implement your business here");
}
答案 1 :(得分:10)
要补充Julien Lafont的答案,以下是您可以在Scala控制器中执行的操作:
def handle = Action { implicit request =>
request.body.asFormUrlEncoded.get("action").headOption match {
case Some("edit") => Ok("Clicked edit")
case Some("remove") => Ok("Clicked remove")
case _ => BadRequest("This action is not allowed")
}
}
答案 2 :(得分:1)
要补充Julien Lafont和OlivierBlanvillain的答案,对于带有错误验证的表单。如果返回该表单,则操作保持不变。因此,过滤掉该操作会在下次发生正确的操作。
val postAction: String = request.body.asFormUrlEncoded.get("action").head
// bind the form request.
val bindFromRequest: Form[CaseClass] = CaseOriginalForm.bindFromRequest
bindFromRequest.fold(
formWithErrors => {
// filter out the action button data (otherwise the first action comes back)
val filterNot: Map[String, String] = formWithErrors.data.filterNot(f => f._1 == "action")
val formWithErrors2= CaseOriginalForm.bind(filterNot)
BadRequest(views.html.FormPage(formWithErrors2))
},
contact => {
Ok( "Succes page " + postAction)
}
)