如何在@select帮助器中允许默认值选择?

Man*_*noj 8 playframework playframework-2.0 scala-template

在我的表单中,我定义了一个下拉列表:

@select(
myForm("category_id"),
options(Category.options()),
'_label -> "Category",
'_default -> "-- Choose a Category --",
'_showConstraints -> false
)
Run Code Online (Sandbox Code Playgroud)

在我的控制器代码中:

Form<Category> catForm = form(Category.class).bindFromRequest();
if(catForm.hasErrors()) {
return badRequest(categoryEdit.render(catForm));
}
Run Code Online (Sandbox Code Playgroud)

表单提交不允许我选择默认值,如果我没有选择,catForm.hasErrors()为true.两个问题:

  1. 如何在下拉列表中选择默认值?

  2. 我想要默认值-1,在哪里设置它?(也许这就是问题所在,没有与-- Choose a Category --选项相关的价值?)

avi*_*vik 1

您可以编写Play 的 HTML 选择帮助程序的替代方案,该帮助程序接受元组作为默认选项。通过这种方式,您可以指定基础值和应显示的文本。

这是第一次尝试,不可否认,这里的一些 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>
}
Run Code Online (Sandbox Code Playgroud)

用法

@_my_select(
  myForm("category_id"),
  options(Category.options()),
  '_label -> "Category", 
  '_default -> ("-1" -> "-- Choose a category --"),
  '_showConstraints -> false
)
Run Code Online (Sandbox Code Playgroud)