我有一个具有许多属性的User对象。在我的编辑个人资料屏幕中,我正在显示这些属性的子集。在相应的控制器操作中,如何仅验证正在编辑的字段而不验证User对象中的所有字段?
我已使用MaxSize,Email,URL等约束对User对象中的字段进行了注释,并且不希望通过手动验证每个字段再次重复它们。
任何指针都将非常感激。谢谢!
答案 0 :(得分:0)
最简单的方法是将完整对象传递给接收方法,然后只验证所有对象。由于您只编辑字段的子集,因此它们将是唯一更改的字段,以及在验证失败时将触发错误的字段。当然,这是假设您从未在数据库中存储无效对象!
如果没有,您还可以使用验证标记创建不从Model扩展的支持bean,并将其传递给表单和控制器。类似的东西:
public class SupportBean {
@Email
public String mail;
@Max(3)
public int size;
//etc, add getters and setters as I'm not sure if it is required.
}
在这两种情况下都会是这样的,如果需要,用一个临时对象替换整个对象User(仔细检查代码,我这里没有Play环境,我可能会做一些错别字/小错误)
*{ assuming parameter 'user' is passed in the render method that creates this view }*
#{form @controller.save()}
#{field 'user.name'}
<p>
<label>&{field.name}</label>
<input type="text" id="${field.id}" name="${field.name}" value="${field.value}" class="${field.errorClass}">
<span class="error">${field.error}</span>
</p>
#{/field}
*{ add more field the same way }*
#{/form}
然后在控制器中:
*{ we tag required for validation }*
public static void save(@Valid User user) {
checkAuthenticity();
if(validation.hasErrors()){
//there are errors, add to flash and redirect to edit page
} else {
user.save();
//redirect
}
}
在路由文件中添加一个POST规则“保存”,然后就可以开始了。
该框架有一个示例项目( validation 我认为它的名称),它包含7种不同的验证方法。最后一个使用JQuery重用类的验证标记,并在提交之前在客户端中运行相同的验证。给他们看看,他们可能会帮助你很多:))