在使用服务器端错误处理和验证时,对于包含基本值和文件输入的表单,当表单带着错误消息返回时,文件输入的值会丢失。因此,用户需要重新上传文件,这会导致用户体验不佳。
要解决文件输入值丢失的问题,您可以在 input 元素上使用 hx-preserve 属性:
<form method="POST" id="binaryForm" enctype="multipart/form-data" hx-swap="outerHTML" hx-target="#binaryForm">
<input hx-preserve id="someId" type="file" name="binaryFile">
<!-- Other code here, such as input error handling. -->
<button type="submit">Submit</button>
</form>
如果文件字段带着错误返回,它们将被显示,前提是 hx-preserve 只放置在 input 上,而不放置在显示错误元素的元素上(例如 ol.errorlist)。如果在特定情况下,您希望文件上传输入返回 而不 保留用户选择的文件(例如,因为文件类型无效),您可以在服务器端通过在字段有相关错误时省略 hx-preserve 属性来管理这种情况。
或者,您可以通过重新构建表单,使文件输入位于将要交换的区域之外,从而在表单错误后保留文件输入。
Before:
<form method="POST" id="binaryForm" enctype="multipart/form-data" hx-swap="outerHTML" hx-target="#binaryForm">
<input type="file" name="binaryFile">
<button type="submit">Submit</button>
</form>
After:
<input form="binaryForm" type="file" name="binaryFile">
<form method="POST" id="binaryForm" enctype="multipart/form-data" hx-swap="outerHTML" hx-target="#binaryForm">
<button type="submit">Submit</button>
</form>
表单重构:在 HTML 结构中,将二进制文件输入移到主表单元素之外。
使用 form 属性:通过添加 form 属性并将其值设置为主表单的 ID 来增强二进制文件输入。这种链接即使文件输入位于表单元素之外,也能将其与表单关联。