【问题标题】:Playframework form and two submit buttonsPlayframework 表单和两个提交按钮
【发布时间】:2012-12-10 01:27:47
【问题描述】:

我有用于编辑订单的表单,但我必须添加用于删除订单的按钮。现在我有两个提交按钮的表单:

@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();
     }
 }

如何处理提交的按钮?

【问题讨论】:

  • 一个 HTML 表单不能有 2 个提交按钮。您可以使用 Javascript 解决此问题(例如,更改“onsubmit”回调中的操作 URL)。这不是 Play2 的特别关注点。
  • 我认为我已经在 PHP 中使用了 2 个提交按钮。例如这应该适用于 PHPlink
  • 好吧,有可能 :) stackoverflow.com/questions/942772/… 对不起我的错误!我会检查 Play2

标签: forms playframework-2.0


【解决方案1】:

所选按钮的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");
}

【讨论】:

  • 我也这样做了,但对我来说行动是空的(虽然不是空的)!有什么线索吗?
【解决方案2】:

为了补充 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")
  }
}

【讨论】:

  • request.body.asFormUrlEncoded.get("submit").headOption 实际上为我工作
  • request.body.asFormUrlEncoded 在我自己的情况下为空,但 form.data 包含该值。
【解决方案3】:

补充Julien LafontOlivierBlanvillain 的答案,在表单验证错误的情况下。如果该表单刚刚返回,则操作保持不变。因此,过滤掉该动作会在下一次给出正确的动作。

  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)
    }
  )

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2018-03-29
    • 1970-01-01
    相关资源
    最近更新 更多