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

8
在我的表单中,我定义了一个下拉列表:
@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. 我该如何允许下拉列表中选择默认值?

  2. 我希望默认值是 -1,应该在哪里设置?(也许这就是问题所在,因为与“-- 选择一个类别 --”选项没有关联的值)

3个回答

3

avik的建议有效。也许您没有正确导入模板。
我是这样做的。首先,按照avik的建议,在views/helper/中创建了一个customSelectField.scala.html

@(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)
    }

因为这样会导致出错。 如果您想以某种方式格式化select周围的html,您可以按照以下方式使用views/helper/中的customField.scala.html进行操作。
@(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)
}

希望这可以帮助你!

谢谢Jakob,我会尝试并在需要进一步帮助时回来。 - Manoj

1
我遇到过类似的问题,并找到了一个更简单的解决方案。
在表单内尝试使用以下代码,而不是Play! helpers:

<select name="category_id">
    <option value="-1">-- Choose a Category --</option>
    @(for((key, value) <- Category.options()){
        <option value="@value"> @key </option>
    }
</select>

谢谢Arturas,我会尝试的。 - Manoj

1
你可以编写一个替代 Play's HTML select helper 的函数,该函数接受元组作为默认选项。这样你就可以同时指定底层值和应显示的文本。
以下是第一次尝试,其中 Scala 有些地方可能有点业余:

app/views/_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
)

我遇到了这个错误-->类型不匹配;找到的是:(play.api.data.Field,Seq[(String,String)],Array[(Symbol,Any)]) => play.api.templates.Html,需要的是:views.html.helper.FieldElements => play.api.templates.Html。注意:隐式方法implicitFieldConstructor在此处不适用,因为它在应用点之后,并且缺少显式结果类型。 - Manoj

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接