【问题标题】:How to create read-only field in View如何在视图中创建只读字段
【发布时间】:2012-12-29 19:36:41
【问题描述】:

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

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

问题:

  1. 问题是返回错误没有值属性。我还能用什么来获得价值?
  2. 我可以跳过@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"))
        }

【问题讨论】:

    标签: scala playframework-2.0


    【解决方案1】:

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

    • Twitter 引导程序被 CSS 禁用:

      @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>
      
    • 2018-01-24 更新

    Play field 现在返回 Optionalsee the docs。这意味着您可以从以下字段中获取值:

    • @form("fieldName").getValue.get(可以抛出NPE
    • @form("fieldName").getValue.getOrElse("defaultValue")

    【讨论】:

    • 我使用的是 scala 2.0.3 并且没有字段方法。我的代码 -> '@leaveform.field("status").value' 并返回错误'value field is not a member of play.api.data.Form[models.LeaveModel]'。
    • hmm.. 我正在使用 java,但文档说:您还可以使用 @elements.field 访问原始字段:playframework.org/documentation/2.0/ScalaFormHelpers
    • @SimonSiah 尝试改用 @leaveform("status").value,我没有使用 Scala 表单的经验,无论如何应该可以。
    【解决方案2】:

    在向用户返回表单时尝试使用 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,埃里希

    【讨论】:

    • 此代码在表单创建过程中运行良好并返回错误。 @leaveform.forField("name")(value => value.value.get)。感谢大家的帮助。
    猜你喜欢
    • 1970-01-01
    • 2011-12-09
    • 1970-01-01
    • 1970-01-01
    • 2020-01-21
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多