【问题标题】:How to map checkboxes in Play Framework with Scala Forms?如何在 Play Framework 中使用 Scala Forms 映射复选框?
【发布时间】:2015-08-11 12:31:13
【问题描述】:

我有一个使用 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
    }
  )
}

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

我也尝试相同:

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

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

【问题讨论】:

    标签: scala playframework playframework-2.3


    【解决方案1】:

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

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

    【讨论】:

      【解决方案2】:

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

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

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

      【讨论】:

        【解决方案3】:

        这更像是一个建议,但我无法发表评论,因为代表少于 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;
        });
        

        【讨论】:

          猜你喜欢
          • 1970-01-01
          • 2016-10-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 2014-04-24
          • 1970-01-01
          • 1970-01-01
          • 2014-09-27
          相关资源
          最近更新 更多