3

我有一个带有文件选择字段的典型 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 的限制?还是典型的浏览器限制?有办法吗?

4

3 回答 3

2

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

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

于 2012-09-18T09:39:47.633 回答
2

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

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

于 2012-09-18T10:13:29.283 回答
1

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

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

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

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

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

于 2012-09-18T09:29:57.330 回答