百里香叶:"th:value"在选项中被拆分为","导致两个值而不是一个值



我有一个状态列表,包括:

德国
  • 伊朗,伊斯兰共和国
  • 英国

我把这个列表放入一个多重选择输入:

<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,它正在获取的列表两个条目:iranislamic 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:

  1. 不自动对url进行编码/解码
  2. 值仍然被分割。

我找到了解决这个问题的方法:

  1. I URL编码后端所有值
  2. 发送到前端
  3. URL解码标签文本中的值
  4. 将选择的值发送到后端
  5. 后端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正在将空格编码为+符号。

最新更新