我正在构建一个表单,用户可以在其中编辑一些个人详细信息(例如姓名,位置等)。我正在使用自定义构建的字段构造函数,我在其他地方没有问题。
@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
这个事实。 有人可以确认这个吗?我怎么能绕过这个呢?这样我就可以有一个预先填写的表格链接到一个对象,但我可以编辑一个一些属性?
感谢您的帮助!
答案 0 :(得分:0)
因此,据我了解您的问题,您希望允许用户更新他的所有详细信息,但他的电子邮件地址。
假设您想要显示他们的电子邮件地址但是不可编辑,则有两种选择:
将您的电子邮件输入标记为“只读”。这将不允许用户更改电子邮件地址,它仍将作为表单发布的一部分发送。
@inputText(updateForm("email"), '_label -> "Email", 'class -> "form-control", 'readonly -> "readonly")
将电子邮件输入标记为“已禁用”。这对您不起作用,因为禁用的输入不会作为表单帖子的一部分发送。 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>
}
如果您不想显示电子邮件地址,则可以使用上面的选项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了解有关表单验证的更多信息。