我有一个典型的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限制?或典型的浏览器限制?有办法吗?
答案 0 :(得分:2)
文件字段可能未预先填写;出于安全考虑,这是一个HTML内容。
如果文件已经上传,您可以记住并提供使用刚刚上传的文件。我还会显示文件输入框。这会(略微)使验证复杂化。
答案 1 :(得分:1)
这是一个正常的用例,你需要处理这个问题,以便保存数据,并在验证错误时向用户显示所选的值。
通常验证错误让工作流拦截器重定向回页面并显示有错误的页面,这意味着你的实际方法永远不会被调用。
Struts2提供了一种方法来准备您的操作正常工作所需的任何数据。用户Preparable界面并使用其准备方法。
在验证之前调用其prepare()
方法,您可以设置显示是否存在任何错误所需的任何值。
简而言之prepare()
方法作为init方法来完成任何此类工作
答案 2 :(得分:1)
出于安全原因,无法更改或初始化文件输入字段的值。
在表单中,您有两个字段:text-field和file-field。 我不认为用户会在他们选择的文件错误时忽略输入字段的值。只有当文本字段中的值错误时,它们才会生气,因此需要再次拾取文件。 因此,您可以在提交表单之前对文本字段值执行ajax验证(或者更好,因为他们键入值!)。如果出现问题,表单未提交,用户修复它并且不会丢失文件字段值。