繁体   English   中英

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

[英]Remove input in form breaks play framework (2.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")
    @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>
}

这可行。 我希望用户能够编辑他的名字,姓氏和位置,而不是他注册的电子邮件。 我首先尝试在电子邮件输入中添加'disabled-> true,但是这破坏了表单(例如,密码不再预先填写,并且在发布表单时出现[IllegalStateException:No value]错误。 这里讨论了类似的问题,但是我的问题更进一步,我不能简单地将电子邮件字段保留在表单之外,代码如下所示:

@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时,我得到相同的IllegaleStateException ...问题不是 ,我相信,在控制器中,只要存在电子邮件字段,一切都可以正常工作...

我怀疑这是由于我在模型中的电子邮件上有一个@constraint导致的。 有人可以确认吗? 以及如何绕过它,以便可以拥有一个链接到对象的预填充表单,但是我只能在其中编辑一些属性?

谢谢你的帮助!

因此,据我所知,您希望允许用户更新其电子邮件地址以外的所有详细信息。

假设您要显示其电子邮件地址,但无法修改,则有两个选项:

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

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

     @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> } 

如果您不想显示电子邮件地址,则可以使用上面的选项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())部分。 有关表单验证的更多信息, 请参见Play文档

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM