如何使用 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 一起使用
我有一个使用 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 一起使用