我有一个状态列表,包括:
德国- 伊朗,伊斯兰共和国 英国
- …
我把这个列表放入一个多重选择输入:
<select th:field="*{statesSelection}" multiple="multiple">
<option
th:each="state : ${states}"
th:value="${state}"
th:text="${state}"></option>
</select>
ui元素正确呈现,并且浏览器的源代码检查显示一切都是正确设置的。
java数据传输对象:
public class Selection implements Serializable {
...
private List<String> statesSelection = new ArrayList<>();
...
}
和实际端点:
@RequestMapping(value = "/select")
public String select(Model model, @ModelAttribute Selection selection) {
}
这个问题
在我选择iran, islamic republic
并按submit后,端点没有获取具有单个条目的列表iran, islamic republic
,它正在获取的列表两个条目:iran
和islamic republic
,因此值在,
处被分割。
我怎样才能防止这种情况的发生?
编辑
我刚刚意识到,只有当iran, islamic republic
是我选择的唯一值时,才会出现问题。只要我选择第二个值和iran,问题就不会发生了。
所以我试着用下面的:
<select th:field="*{statesSelection}" multiple="multiple">
<option
th:each="state : ${states}"
th:value="${#uris.escapePath(state)}"
th:text="${state}"></option>
</select>
但这导致了以下结果:iran, %20islamic%20republic
在后端导致:
- % 20伊斯兰共和国% 20
So to things:
- 不自动对url进行编码/解码
- 值仍然被分割。
我找到了解决这个问题的方法:
- I URL编码后端所有值
- 发送到前端
- URL解码标签文本中的值
- 将选择的值发送到后端
- 后端URL解码值
<select th:field="*{statesSelection}" multiple="multiple">
<option
th:each="state : ${states}"
th:value="${state}"
th:text="${#string.replace(#uris.unescapePath(state), '+', ' ')}"></option>
</select>
我需要用替换+,因为java URL Encoder正在将空格编码为+符号。