如何使用 Scala Forms 映射 Play Framework 中的复选框?

How to map checkboxes in Play Framework with Scala Forms?

我有一个使用 Scala 的 Play Framework 2.3 项目。

我有一个模型:

case class User(
      name: String,
      login: String,
      password: String,
      isAdministrator: Boolean)

并且在没有播放表单助手的情况下在视图中表单:

<form action="@controllers.routes.Users.create()" method="POST">
    <input type="text" name="login">
    <input type="text" name="name">
    <input type="password" name="password">
    <input type="checkbox" name="isAdministrator">
    <button type="submit" class="btn btn-success">Save</button>
</form>

尝试将其映射到控制器中,使用 Scala 形式:

val userForm = EntityForm[User](
  _.name -> nonEmptyText,
  _.login -> nonEmptyText,
  _.password -> nonEmptyText,
  _.isAdministrator -> boolean,
  _.serviceProviderId -> optional(number)
)

def create = Action { implicit request =>
  userForm.bindFromRequest.fold(
    formWithErrors => BadRequest(
      views.html.users.userNew()
    ),
    user => { 
      //saving user code
    }
  )
}

这总是像一个错误的请求一样有效。调试器向我展示了复选框映射中的错误。请求中的复选框如下所示:password -> ArrayBuffer(on)

我也尝试同样的方法:

_.isAdministrator -> checked("on"),

而且它也不起作用。 使用 Scala Forms 在 Play Framework 中映射复选框的正确方法是什么?

这更像是一个建议,但我无法发表评论,因为只有不到 50 个代表。

我认为使用 JS 调用服务器比使用 Play 处理用户输入更容易混淆,除非您希望您的站点在没有 JS 的情况下工作。

举个例子。我假设您为 /doStuff/:parameter

设置了 (POST) 路由

HTML:

<textarea id="input"></textarea>
<button id="save">Save</button>

JS:

$("#save").click(function(){
    var input =  $("#input").val()
    $.post("/doStuff/" + input, function (data) {
        // Handle server data, passed with Ok("Here's my data")
    });
    return false;
});

当您将 value="true" 添加到复选框时,以下所有代码都有效,如下所示:

<input type="checkbox" name="isAdministrator" value="true"/>

我知道这是个老问题,但我今天在寻找解决方案时发现了它。这是我映射复选框值的方法,但我不使用 case 类 进行映射。

val isAdministrator = request.body.dataParts.get("isAdministrator").exists(_.nonEmpty)

我将此解决方案与 Playframework 2.5.8 一起使用