删除表单中断输入播放框架(2.3)

时间:2014-06-25 15:40:26

标签: java forms playframework-2.0 constraints illegalstateexception

我正在构建一个表单,用户可以在其中编辑一些个人详细信息(例如姓名,位置等)。我正在使用自定义构建的字段构造函数,我在其他地方没有问题。

@form(action = routes.Persons.update(), 'class -> "well well-lg form-horizontal"){
  <fieldset>
    @inputText(updateForm("forname"), '_label -> "First name", 'class -> "form-control")
    @inputText(updateForm("surname"), '_label -> "Last name", 'class -> "form-control")
    @inputText(updateForm("email"), '_label -> "Email", 'class -> "form-control")
    @inputPassword(updateForm("passwordHash"), '_label -> "Password", 'class -> "form-control")
  </fieldset>
  <button type="submit" class="btn btn-primary">Update</button>
}

这很有效。我希望用户能够编辑他的名字,姓氏和位置,然后他注册的电子邮件。我首先尝试添加&#39;禁用 - &gt;对于电子邮件输入是真的,但这打破了表单(例如,密码不再预先填写,并且在发布表单时出现[IllegalStateException:No value]错误。讨论了类似的问题{{3} },但我的问题更进一步。我不能简单地将电子邮件字段留在表单之外。代码如下所示:

@form(action = routes.Persons.update(), 'class -> "well well-lg form-horizontal"){
  <fieldset>
    @inputText(updateForm("forname"), '_label -> "First name", 'class -> "form-control")
    @inputText(updateForm("surname"), '_label -> "Last name", 'class -> "form-control")
    @inputPassword(updateForm("passwordHash"), '_label -> "Password", 'class -> "form-control")
  </fieldset>
  <button type="submit" class="btn btn-primary">Update</button>
 }

当我尝试这个时,表单再次被破坏,当它被发布时我得到相同的IllegaleStateException ...问题是不是,我相信,在控制器中,只要电子邮件字段存在,一切正常......

我怀疑这是因为模型中的电子邮件中有@constraint这个事实。 有人可以确认这个吗?我怎么能绕过这个呢?这样我就可以有一个预先填写的表格链接到一个对象,但我可以编辑一个一些属性?

感谢您的帮助!

1 个答案:

答案 0 :(得分:0)

因此,据我了解您的问题,您希望允许用户更新他的所有详细信息,但他的电子邮件地址。

假设您想要显示他们的电子邮件地址但是不可编辑,则有两种选择:

  1. 将您的电子邮件输入标记为“只读”。这将不允许用户更改电子邮件地址,它仍将作为表单发布的一部分发送。

    @inputText(updateForm("email"), '_label -> "Email", 'class -> "form-control", 'readonly -> "readonly")
    
  2. 将电子邮件输入标记为“已禁用”。这对您不起作用,因为禁用的输入不会作为表单帖子的一部分发送。 See here。但是,您可以通过向电子邮件地址的表单添加隐藏输入来解决此问题。发布表单后,仍会发送用户邮件地址,这不会破坏您的控制器。

    @form(action = routes.Persons.update(), 'class -> "well well-lg form-horizontal") {
      <input type="hidden" name="email" value="@updateForm("email").value"/>
      <fieldset>
        @inputText(updateForm("forname"), '_label -> "First name", 'class -> "form-control")
        @inputText(updateForm("surname"), '_label -> "Last name", 'class -> "form-control")
        @inputText(updateForm("email"), '_label -> "Email", 'class -> "form-control", 'disabled -> "disabled")
        @inputPassword(updateForm("passwordHash"), '_label -> "Password", 'class -> "form-control")
      </fieldset>
      <button type="submit" class="btn btn-primary">Update</button>
    }
    
  3. 如果您不想显示电子邮件地址,则可以使用上面的选项2,然后删除电子邮件输入。您的控制器不会中断,因为将发布隐藏输入的电子邮件值。

    至于你获得IllegalStateException的原因,那是因为你似乎没有在你的控制器中验证你的表单对象。您的@Constraint.xxx导致了这一点是正确的,但是,如果您正确验证表单对象,则不应该达到这一点。请参阅下面的示例:

    public static Result update() {
        Form<Person> personForm = Form.form(Person.class).bindFromRequest(request());
        if(personForm.hasErrors()) {
            return badRequest(person.render(personForm));
        }
    
        personForm.get().save();
    
        return ok("Saved...");
    }
    

    请注意if(personForm.hasErrors())部分。 See the Play docs了解有关表单验证的更多信息。