[英]How to reverse route to an action from my form in Play Framework 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
导致的。 有人可以确认吗? 以及如何绕过它,以便可以拥有一个链接到对象的预填充表单,但是我只能在其中编辑一些属性?
谢谢你的帮助!
因此,据我所知,您希望允许用户更新其除电子邮件地址以外的所有详细信息。
假设您要显示其电子邮件地址,但无法修改,则有两个选项:
将您的电子邮件输入标记为“只读”。 这将不允许用户更改电子邮件地址,并且仍将作为表单发布的一部分发送。
@inputText(updateForm("email"), '_label -> "Email", 'class -> "form-control", 'readonly -> "readonly")
将电子邮件输入标记为“已禁用”。 这对您不起作用,因为禁用的输入不会作为表单发布的一部分发送。 看这里 。 但是,您可以通过在表单中为电子邮件地址添加隐藏的输入来解决此问题。 发布表单后,用户的邮件地址仍将被发送,这不会破坏您的控制器。
@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...");
}
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.