如何解决表单验证错误:呈现还是重定向?
| 在play框架文档中,有两种不同的方式来处理带有验证错误的操作: 重定向到索引(文档的验证部分): if (validation.hasErrors()) {
params.flash(); // add http parameters to the flash scope
validation.keep(); // keep the errors for the next request
index();
}
渲染到表单模板(在本教程中):
if (validation.hasErrors()) {
render(\"@form\",post);
}
做这个的最好方式是什么 ?呈现还是重定向?
解决方法
两种方法都有优点和缺点。
我个人偏爱使用重定向方法,原因是浏览器URL正确指出了您在应用程序中的位置。例如,如果您的索引页面调用了登录操作,或者您不使用重定向,那么当您实际上位于索引页面上时,浏览器URL将显示登录信息。
但是,这种方法存在问题。要实现重定向并保留验证错误消息,您需要使用
validation.keep()
和params.flash()
(有关详细信息,请参见此处的帖子),以便为下一个请求保留验证错误。这是通过在Cookie中存储验证错误和用户输入的参数在后台实现的(以确保Play保持无状态)。如您所知,HTTP规范将Cookies限制为4Kb,因此存在以下风险:如果您输入的数据大于4Kb(对于您要输入大块文本的表单来说可能是这样),则Cookie会溢出,您将丢失数据。
Play最初使用的方法是重定向方法,但是由于Cookie的限制,第二种方法专门作为解决方法添加到了文档中。
第三种,也是一种可能更清洁的方法是使用JavaScript从客户端执行验证,而javascript使用AJAX调用一些服务器端逻辑。在“ 4”示例应用程序的第10个示例中可以看到此示例。
, 我希望再次呈现表单模板,因为我认为重定向在这种情况下没有用。如果用户按F5键,则仍然可以再次发送相同的数据。用户唯一的问题是获得取消操作。
为了避免提到URL问题COdemwnci,您可以在routes.conf中使用以下技巧
GET /customer/edit CustomerController.load()
POST /customer/edit CustomerController.save()
然后,您将始终拥有一个干净的URL。
, 我也进行重定向,以获取干净的URL。但是,从一种变体切换到另一种变体通常不仅仅需要保留验证结果和http参数,即要照顾所有其他渲染参数。
我最近的例子是表单验证和地址更正:
之前
public static void step2(@Valid Address address)
{
AddressResult result = ....; // perform address check
if (result.isCorrected())
{
validation.addError(\"address.streetAndHouseNumber\",\"Street has been corrected.\");
address.streetAndHouseNumber = result.getStreet();
render(\"step1.html\",address);
}
... // continue
}
后
public static void step2(@Valid Address address)
{
AddressResult result = ....; // perform address check
if (result.isCorrected())
{
validation.addError(\"address.streetAndHouseNumber\",\"Street has been corrected.\");
// ----- note this line --------
params.put(\"address.streetAndHouseNumber\",result.getStreet());
// -----------------------------
params.flash();
validation.keep();
step1();
}
... // continue
}
尽管可以在变量2中轻松填充局部范围的变量,但我们需要更新http参数。直接在Flash作用域中写入。
任何人都具有适当的抽象级别,可以轻松地在两个变体之间切换吗?
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。