【问题标题】:Struts2 - file selection field value disappears on validation errorStruts2 - 文件选择字段值在验证错误时消失
【发布时间】:2012-09-18 20:24:43
【问题描述】:

我有一个带有文件选择字段的典型 struts2 表单:

<s:form action="%{#parameters.myAction}" namespace="/" method="post" name="myForm" enctype="multipart/form-data" focusElement="storeBrandNameId">
 <s:textfield name="storeBrandName" id="storeBrandNameId" size="40" maxlength="50" required="true" key="storeBrandName-label" tooltip="%{getText('storeBrandName-label-help')}" />
 <s:file name="storeImage" key="storeImage-label"/>
 /* ... Other fields removed for clarity ... */
 <s:submit key="submit" />
</s:form>

表单工作正常,除非我遇到验证错误(使用 XML 验证)。在这种情况下,除了所选文件(如果有)之外,所有字段值都将被保留。

为什么选择的文件在验证错误时被清除?这是我这边的错误吗? struts2 的限制?还是典型的浏览器限制?有办法吗?

【问题讨论】:

  • 这似乎是浏览器的限制,但也许有其他方法可以做到这一点。

标签: file validation struts2


【解决方案1】:

出于安全原因,不能更改或初始化文件输入字段的值。

在您的表单中,您有两个字段,文本字段和文件字段。 当他们选择的文件错误时,我认为用户不会关心他们是否会丢失输入字段的值。只有当文本字段中的值错误时他们才会生气,因此他们需要再次提取文件。 因此,您可以在提交表单之前对文本字段值进行 ajax 验证(或者更好,因为他们键入值!)。如果有问题,表单没有提交,用户修复它并且不要丢失文件字段值。

【讨论】:

  • 我喜欢预先验证的想法,以避免服务器端错误。我只是将validate="true" 添加到&lt;s:form 以启用客户端验证。谢谢。
  • @Resh32 您不能仅仅依赖客户端验证,因为它可能会被轻易绕过。
  • @Dave Newton 我没有,但我是否正确假设 validate="true" 执行客户端和服务器端验证?
  • @Resh32 似乎很容易尝试。请注意,并非所有验证都在客户端可用。
【解决方案2】:

文件字段可能未预先填写;这是一个 HTML 的东西,出于安全目的。

如果文件已经上传,您可以记住这一点并提议使用刚刚上传的文件。我仍然会显示文件输入框。这会使验证(稍微)复杂化。

【讨论】:

    【解决方案3】:

    这是一个正常的用例,您需要处理它以保存数据并向用户显示所选值,即使在验证错误时也是如此。

    通常验证错误会让工作流拦截器重定向回页面并显示有错误的页面,这意味着您的实际方法永远不会被调用。

    Struts2 提供了一种方法来准备您的操作正常工作所需的任何数据。用户Preparable 接口并使用其准备方法。

    它的prepare() 方法在验证之前被调用,你可以设置任何需要的值来显示是否有任何错误。

    简而言之,prepare() 方法作为 init 方法来完成任何此类工作

    【讨论】:

      猜你喜欢
      • 2011-12-27
      • 2011-02-03
      • 2014-03-29
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多