斯卡拉玩!使用2个单选按钮进行表单验证

时间:2017-08-17 13:22:53

标签: forms scala validation playframework radio-button

我创建了一个Scala Play程序,并希望将两个单选按钮合并到同一表单上。

  • 加载页面时,单选按钮都没有设置值。
  • 两个单选按钮的选项均为“是”或“否”。

我想知道如何验证两个无线电,以便Play在以下情况下接受表单:

  • 仅选择第一个无按钮

  • 当第一个是和第二个是或否按钮被选中时。

我希望使用bindFromRequest.fold方法显示错误的任何其他场景。

这是我的模特:

    package viewmodels

case class YesNoRadioViewModel2(firstRadio: String, secondRadio:String) {

}

/**
  * View model for pages with yes/no style radio questions.
  */
object YesNoRadioViewModel2 {
  def apply(form: play.api.data.Form[YesNoRadioViewModel2]) = {
    new YesNoRadioViewModel2(
      form.data.get("firstRadio").get,
      form.data.getOrElse("secondRadio","no"))
  }
}

这是我的表格:

val yesNoRadioForm2 = Form(
mapping(
  "firstRadio" -> text.verifying(!_.isEmpty),
  "secondRadio" -> text.verifying()
)
(YesNoRadioViewModel2.apply)(YesNoRadioViewModel2.unapply))

这是我的控制器:

def twoRadioPost: Action[AnyContent] = MyCustomAction.async { implicit request =>

  yesNoRadioForm2.bindFromRequest.fold(formWithErrors =>
  Future(BadRequest(views.html.myproject.twoRadios(formWithErrors)))
    ,
    model =>
   Do something 
)
  }

任何帮助将不胜感激!

提前致谢!

2 个答案:

答案 0 :(得分:2)

我使用Play 2.6.3

这里是index.scala.html

@import models.MyForm.FormData
@(theForm:Form[FormData])(implicit messages: Messages, request:RequestHeader)

@main("Welcome to Play") {
  <h1>Welcome to Play!</h1>
  @if(theForm.hasGlobalErrors) {
    <ul>
    @for(error <- theForm.globalErrors) {
      <li>@error.format</li>
    }
    </ul>
  }
  @helper.form(action = helper.CSRF(routes.HomeController.processForm())){
    @helper.inputRadioGroup(theForm("field1"), Seq("Yes" -> "Yes", "No" -> "No"))
    @helper.inputRadioGroup(theForm("field2"), Seq("Yes" -> "Yes", "No" -> "No"))
    <button type="submit">Send</button>
  }
}

此处MyForm包中定义了models对象:

package models

import play.api.data.Form
import play.api.data.Forms._

/**
  * Created by alex on 8/17/17.
  */
object MyForm {
  case class FormData(firstYesNo:Option[String], secondYesNo:Option[String])

  val theForm = Form(
    mapping(
      "field1" -> optional(text),
      "field2" -> optional(text)
    )(FormData.apply)(FormData.unapply) verifying(
        "Form failed the validation",
        fields => fields match{
          case formData => formData.firstYesNo match{
            case None => false
            case Some("No") => if(!formData.secondYesNo.isDefined) true else false
            case Some("Yes") => if(formData.secondYesNo.isDefined) true else false
          }
        }
      )
  )
}

这是我唯一的控制器的代码:

import javax.inject._
import models.MyForm.theForm
import play.api.mvc._

/**
 * This controller creates an `Action` to handle HTTP requests to the
 * application's home page.
 */
@Singleton
class HomeController @Inject()(cc: ControllerComponents) extends AbstractController(cc) with play.api.i18n.I18nSupport{

  /**
   * Create an Action to render an HTML page.
   *
   * The configuration in the `routes` file means that this method
   * will be called when the application receives a `GET` request with
   * a path of `/`.
   */
  def index() = Action { implicit request: Request[AnyContent] =>
    Ok(views.html.index(theForm))
  }

  def processForm() = Action{implicit request:Request[AnyContent] =>
    theForm.bindFromRequest().fold(
      formWithErrors => BadRequest(views.html.index(formWithErrors)),
      data => Ok("Form successfully submitted")
    )
  }
}

我的routes文件的内容:

GET     /                           controllers.HomeController.index

POST    /processForm                controllers.HomeController.processForm

# Map static resources from the /public folder to the /assets URL path
GET     /assets/*file               controllers.Assets.versioned(path="/public", file: Asset)

最后,我们需要将其添加到application.conf

play.filters.enabled += play.filters.csrf.CSRFFilter

希望这会对你有所帮助。

答案 1 :(得分:0)

最后,我创建了两种不同的形式,并使用它们来验证单选按钮。

我的控制器

Form1.bindFromRequest.fold(
  formWithErrors => Future(BadRequest(views.html.myproject.form(formWithErrors,Form2)))
  ,
  model =>
    if(model.radioName.equals("yes")){
      Form2.bindFromRequest.fold(
        formWithErrors => Future(BadRequest(views.html.myproject.form(Form1,formWithErrors)))
        ,
        model =>
          if(model.radioName.equals("yes")){
            Future(Ok(GOSOMEWHERE()))
          }else{
            Future(Ok(GOSOMEWHERE()))
          })
    }else{ Future(Ok(GOSOMEWHERE())) })

我的表格

val Form1 = Form(
mapping(
  "firstRadio" -> text.verifying(!_.isEmpty)
)
(YesNoRadioViewModel.apply)(YesNoRadioViewModel.unapply))



val Form2 = Form(
mapping(
  "secondRadio" -> text.verifying()
)
(YesNoRadioViewModel.apply)(YesNoRadioViewModel.unapply))