在我的表单中,我已经定义了一个下拉列表:
@select(
myForm("category_id"),
options(Category.options()),
'_label -> "Category",
'_default -> "-- Choose a Category --",
'_showConstraints -> false
)
在我的控制器代码中:
Form<Category> catForm = form(Category.class).bindFromRequest();
if(catForm.hasErrors()) {
return badRequest(categoryEdit.render(catForm));
}
表单提交不允许我选择默认值,如果我没有选择,则catForm.hasErrors()为true。两个问题:
如何在下拉列表中选择默认值?
我希望默认值为-1
,在哪里设置? (也许这就是问题所在,没有与-- Choose a Category --
选项相关的价值?)
答案 0 :(得分:3)
aviks建议正在发挥作用。也许您没有正确导入模板。
我是这样做的。首先,我在views/helper/
中创建了 customSelectField.scala.html ,因为avik建议:
@(field: play.api.data.Field, options: Seq[(String,String)], args: (Symbol,Any)*)(implicit handler: FieldConstructor, lang: play.api.i18n.Lang)
@getAsTuple(x : Any) = @{
x match {
case (value: String, text: String) => (value, text)
case _ => ("-1", "Select")
}
}
@input(field, args:_*) { (id, name, value, htmlArgs) =>
<select id="@id" name="@name" @toHtmlArgs(htmlArgs)>
@args.toMap.get('_default).map { dv =>
<option class="blank" value="@getAsTuple(dv)._1">@getAsTuple(dv)._2</option>
}
@options.map { v =>
<option value="@v._1" @(if(value == Some(v._1)) "selected" else "")>@v._2</option>
}
</select>
}
然后在我的模板中,例如index.scala.html,我想要我做的选择:
@import helper._
@helper.customSelectField(
field = proposeNewTimeForm("selectTime"),
options = times.get,
'_label -> "Category",
'_default -> ("-1" -> "-- Choose a category --"),
'_showConstraints -> false
)
请记住,您应不执行:
@implicitField = @{
FieldConstructor(helper.customSelectField.f)
}
因为这会导致您的错误。
如果您想以某种方式格式化选择周围的html,您可以像我一样
一个customField.scala.html
在views / helper /中:
@(elements: helper.FieldElements)
@elements.input
<span class="errors">@elements.errors.mkString(", ")</span>
<span class="help">@elements.infos.mkString(", ")</span>
然后在index.scala.html
的顶部:
@import helper._
@implicitField = @{
FieldConstructor(helper.customField.f)
}
希望这有帮助!
答案 1 :(得分:1)
您可以编写Play's HTML select helper的替代方案,接受默认选项的元组。这样,您可以指定基础值和应显示的文本。
这是第一次努力,这里的一些Scala无疑是一个小业余爱好者:
应用/视图/ _my_select.scala.html 强>
@(field: play.api.data.Field, options: Seq[(String,String)], args: (Symbol,Any)*)(implicit handler: helper.FieldConstructor, lang: play.api.i18n.Lang)
@import helper.input
@getAsTuple(x : Any) = @{
x match {
case (value: String, text: String) => (value, text)
case _ => ("-1", "Select")
}
}
@input(field, args:_*) { (id, name, value, htmlArgs) =>
<select id="@id" name="@name" @toHtmlArgs(htmlArgs)>
@args.toMap.get('_default).map { dv =>
<option class="blank" value="@getAsTuple(dv)._1">@getAsTuple(dv)._2</option>
}
@options.map { v =>
<option value="@v._1" @(if(value == Some(v._1)) "selected" else "")>@v._2</option>
}
</select>
}
<强>用法强>
@_my_select(
myForm("category_id"),
options(Category.options()),
'_label -> "Category",
'_default -> ("-1" -> "-- Choose a category --"),
'_showConstraints -> false
)
答案 2 :(得分:1)
我遇到了类似的问题,发现了一个更简单的解决方案 而不是玩!帮助者在你的表单中尝试这个:
<select name="category_id">
<option value="-1">-- Choose a Category --</option>
@(for((key, value) <- Category.options()){
<option value="@value"> @key </option>
}
</select>