Scala 如何在视图中创建只读字段

Scala 如何在视图中创建只读字段,scala,playframework-2.0,Scala,Playframework 2.0,我有一个包含两个字段的表单-empno和name。两者都用默认值填充。在视图中显示时,我希望empno是只读的,name是可编辑的 在视图创建中,我使用@leaveform.value.get.empno仅显示就绪并正常工作。该问题仅在插入过程中出现,错误为([NoTouchElementException:None.get]) 问题: 问题是返回错误没有value属性。我还可以使用什么来获取该值 我是否可以跳过只读字段的@inputText 请参阅以下我的代码: // ***** CONTRO

我有一个包含两个字段的表单-
empno
name
。两者都用默认值填充。在视图中显示时,我希望
empno
是只读的,
name
是可编辑的

在视图创建中,我使用
@leaveform.value.get.empno
仅显示就绪并正常工作。该问题仅在插入过程中出现,错误为
([NoTouchElementException:None.get])

问题:

  • 问题是返回错误没有value属性。我还可以使用什么来获取该值
  • 我是否可以跳过只读字段的
    @inputText
  • 请参阅以下我的代码:

    // ***** CONTROLLER *****//
    
    val leaveform = Form[LeaveModel](
          mapping(
              "empno" -> nonEmptyText,
              "name" -> nonEmptyText
          )((no, empno) => LeaveModel(empno, name))
          ((leave: LeaveModel) => Some(leave.empno, leave.name))
    )
    
    def create = withAuth { username => implicit request =>
    
      // Define default values
      val empno = "STUDENT"
      val name = ""
    
      // Set default values
      val filledForm = leaveform.fill(LeaveModel(empno,name))
      Ok(html.leave.form(filledForm))
    }
    
    def insert = Action (
        implicit request => {
            leaveform.bindFromRequest.fold(
                error => {
                    BadRequest(html.leave.form(error)) // Question 1. Here is the error.
                },
                leave => {
                   LeaveModel.insert(leave)
                   Redirect(routes.indexController.index())
                }
            )  
          }
      )
    
    // ***** VIEW START***** //
    @(leaveform: Form[LeaveModel])
    @leaveform.value.get.empno
    @helper.form(
        action = (routes.LeaveController.update(oid)),
            'id -> "leaveform") {
                @inputText(leaveform("empno")) // Question 2. 
                @inputText(leaveform("name"))
            }
    

    不强制使用表单帮助程序。如果使用它们,可以传递属性
    readonly
    ,或者使用CSS设置字段样式,使其看起来是只读的

    • CSS禁用的Twitter引导:

      @inputText(
          editForm("createdOn"), 
          'id -> "createdOn", 
          'class -> "input-xlarge disabled", 
          '_label -> Messages("createdOn"), 
          '_help -> ""
      )
      
    • 传递可选属性:
      readonly

      @inputText(
          editForm("createdOn"), 
          'id -> "createdOn", 
          'class -> "input-xlarge", 
          '_label -> Messages("createdOn"), 
          'readonly -> "readonly", 
          '_help -> " This is read only"
      )
      
    • 也可以不重新发送字段,而是显示其值:

      <span class="date">Created on: @editForm("createdOn").value</span>
      
      创建于:@editForm(“createdOn”).value
      
    • 更新2018-01-24

    游戏场现在返回一个
    可选的
    。这意味着您可以从如下字段中获取值:

    • @form(“fieldName”).getValue.get
      (可以抛出一个
      NPE
    • @form(“fieldName”).getValue.getOrElse(“defaultValue”)

    将表单返回给用户时,尝试使用Flash上下文:

    def create = withAuth { username => implicit request =>
            // leaveForm initialization as before
    
            // use form data from flash if present
            val form = if (flash.get("error").isDefined)
                leaveForm.bind(flash.data)
            else
                leaveForm
            Ok(stakeholders.register(form))
    }
    
    def insert = Action { implicit request =>
            leaveForm.bindFromRequest.fold(
                    hasErrors = { form =>
                        Redirect(routes.Leaves.create).  // put correct route here
                            flashing(Flash(form.data) +
                                ("error" -> Messages("validation.errors"))) // customize error message
                    },
                    leave => {
                        LeaveModel.insert(leave)
                        Redirect(routes.indexController.index())
                }
            )
        }
    

    HTH,Erich

    我使用的是scala 2.0.3,没有字段方法。我的代码->'@leaveform.field(“status”).value'和return error'value字段不是play.api.data.Form[models.LeaveModel]'的成员。hmm。。我使用的是java,但文档上说:您还可以使用@elements.field:.访问原始字段。@SimonSiah尝试使用
    @leaveform(“status”)。value
    相反,我没有使用Scala表单的经验,无论如何,这应该是可行的。此代码在表单创建过程中运行良好,并返回错误@forField(“name”)(value=>value.value.get)。谢谢大家的帮助。