表单Validaton错误:渲染还是重定向?

eti*_*iau 6 validation playframework

在play框架文档中,有两种不同的方法来处理带有验证错误的操作:

  • 重定向到索引(文档的验证部分):
    if (validation.hasErrors()) {
        params.flash(); // add http parameters to the flash scope
        validation.keep();  // keep the errors for the next request
        index();
    }
Run Code Online (Sandbox Code Playgroud)
  • 渲染到表单模板(在教程中):
    if (validation.hasErrors()) {
        render("@form", post);
    }
Run Code Online (Sandbox Code Playgroud)

做这个的最好方式是什么 ?渲染还是重定向?

Cod*_*nci 7

两种方法都有利弊.

我个人的偏好是使用重定向方法,原因是浏览器URL正确地指出了您在应用程序中的位置.例如,如果您的索引页面调用登录操作,如果您不使用重定向,那么当您实际在索引页面上有错误时,浏览器URL将显示登录.

但是,这种方法存在问题.要实现重定向并保留验证错误消息,您需要使用validation.keep()params.flash()(请参阅此处的详细信息),以便为下一个请求保留验证错误.这是在幕后通过将验证错误和用户输入的参数存储在Cookie中来实现的(以确保Play保持无状态).您可能已经知道,HTTP规范将Cookie限制为4Kb,因此如果您输入的数据大于4Kb(这对于您输入大块文本的表单可能是这样),那么您的Cookie将会溢出,你会丢失数据.

Play使用的原始方法是重定向方法,但由于Cookie限制,第二种方法作为解决方法专门添加到文档中.

第三种,也可能是更清洁的选择是使用javascript从客户端执行验证,该javascript使用AJAX来调用某些服务器端逻辑.在samples-and-test/validation样本申请的第10个例子中可以看到这样的样本.