Playframework 如何允许在@select助手中选择默认值?

Playframework 如何允许在@select助手中选择默认值?,playframework,playframework-2.0,scala-template,Playframework,Playframework 2.0,Scala Template,在我的表单中,我定义了一个下拉列表: @select( myForm("category_id"), options(Category.options()), '_label -> "Category", '_default -> "-- Choose a Category --", '_showConstraints -> false ) 在我的控制器代码中: Form<Category> catForm = form(Category.class).bindF

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

@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));
}
formcatform=Form(Category.class).bindFromRequest();
if(catForm.hasErrors()){
返回badRequest(categoryEdit.render(catForm));
}
表单提交不允许我选择默认值,如果我没有选择,则catForm.hasErrors()为true。两个问题:

  • 如何允许在dropdownlist中选择默认值

  • 我希望默认值为
    -1
    ,在哪里设置?(可能这就是问题所在,没有与
    --选择类别--
    选项?)相关的值)


  • 您可以编写一个替代方案,接受默认选项的元组。通过这种方式,您可以指定基础值和应显示的文本

    这是第一次尝试,这里的一些Scala显然有点业余:

    app/views/\u my\u 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>
    }
    

    阿维克斯的建议奏效了。可能您没有正确导入模板。 我是这样做的。首先,我按照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>
    }
    
    记住你应该而不是做:

    @implicitField = @{
            FieldConstructor(helper.customSelectField.f)
        }
    
    因为这会导致你的错误

    如果您想格式化围绕着选择的html,您可以像我一样使用它 视图/helper/中的
    customField.scala.html

    @(elements: helper.FieldElements)
    
    @elements.input
    <span class="errors">@elements.errors.mkString(", ")</span>
    <span class="help">@elements.infos.mkString(", ")</span>
    

    希望这有帮助

    我遇到了类似的问题,找到了一个更简单的解决方案。
    而不是玩!帮助者可以在表单中尝试以下操作:

    <select name="category_id">
        <option value="-1">-- Choose a Category --</option>
        @(for((key, value) <- Category.options()){
            <option value="@value"> @key </option>
        }
    </select>
    
    
    --选择一个类别--
    
    @(对于((键,值)我得到此错误-->类型不匹配;已找到:(play.api.data.Field,Seq[(String,String)],Array[(Symbol,Any)])=>play.api.templates.Html必填项:views.Html.helper.FieldElements=>play.api.templates.Html注意:隐式方法implicitFieldConstructor不适用于此处,因为它位于应用程序点之后,并且缺少显式结果类型谢谢Jakob,如果需要进一步的帮助,我将尝试返回。谢谢Arturas,我将尝试
    @(elements: helper.FieldElements)
    
    @elements.input
    <span class="errors">@elements.errors.mkString(", ")</span>
    <span class="help">@elements.infos.mkString(", ")</span>
    
    @import helper._
    @implicitField = @{
        FieldConstructor(helper.customField.f)
    }
    
    <select name="category_id">
        <option value="-1">-- Choose a Category --</option>
        @(for((key, value) <- Category.options()){
            <option value="@value"> @key </option>
        }
    </select>