Thymeleaf #списки.содержит () выражение утилита не работает
Я работаю со стандартным диалектом thymeleaf и пытаюсь отобразить список флажков в форме. Рендеринг в порядке, однако проблема заключается в том, что я пытаюсь применить свойство "checked" к флажкам, используя списки thymeleaf#.содержит () метод утилиты выражения.
Итак, у меня есть класс модели, который имеет следующие поля:
private List<Template> templates;
@FormParam("selectedTemplates")
private List<String> selectedTemplates = Lists.newArrayList();
HTML-фрагмент шаблона Thymeleaf:
<div th:each="template : *{templates}">
<input type="checkbox" name="selectedTemplates" th:value="${template.id}"
th:checked="${#lists.contains(product.selectedTemplates, template.id)}" />
<label th:text="${template.filename} + ' (' + ${template.description} + ')'" />
<!-- Attempt to use the list contains to check the field -->
<div th:text="${product.selectedTemplates}"/>
<div th:text="${template.id}"/>
<div th:text="${#lists.contains(product.selectedTemplates, template.id)}" />
</div>
Вывод на странице для одного из флажков, который должен быть выбранный.
<input type="checkbox" name="selectedTemplates" value="4" /> (Template Name)
<div>[4,5]</div>
<div>4</div>
<div>false<div>
Итак, как вы можете видеть, я печатаю список, который имеет значения [4,5], и я использую списки#.содержит метод, чтобы увидеть, если он имеет template.id в нем, однако, метод всегда возвращает false. Я даже попробовал некоторые жестко закодированные идентификаторы, чтобы проверить метод, и я всегда получаю "ложь" обратно.
Например:
<div th:text="${product.selectedTemplates}"/>
<div th:text="${#lists.contains(product.selectedTemplates, 4)}" />
Печатает [4,5]ложь
<div th:text="${product.selectedTemplates}"/>
<div th:text="${#lists.contains(product.selectedTemplates, '4')}" />
Печатает [4,5]ложь
Не знаю, что я делаю не так, но это кажется таким прямым, не знаю, что еще можно попробовать. Мое предположение таково что-то не так с синтаксисом. Любые предложения или советы очень ценятся. Я не в состоянии найти какие-либо ресурсы по устранению этой проблемы, руководство thymeleaf быстро замалчивает этот раздел.
4 ответов:
Я задал этот ответ на форуме thymeleaf и получил некоторую помощь, чтобы определить первопричину и разрешение. Видишь [http://forum.thymeleaf.org/Problem-with-thymeleaf-expression-utility-lists-contains-td4027317.html][1]
По существу, одиночные символьные строки по умолчанию интерпретируются как символьный тип и поэтому никогда не совпадают ни с одной из строк в списке. Многозначные строки вычисляются в строковый тип, поэтому работают, как и ожидалось. Путем инкапсуляции при поиске значения в html-кодированных кавычках синтаксический анализатор вынужден оценивать строку с одним символом как строковый тип, а не тип char. Например:<div th:text="${#lists.contains(testList, "3")}"/> <div th:text="${#lists.contains(testList, "P")}"/>Просто хотел опубликовать это на случай, если кто-то заинтересуется первопричиной и решением.
Я знаю, что вопрос старый, но я публикую этот ответ, поэтому он может быть полезен другим пользователям, имеющим ту же проблему.
Я не знаю, вы это или другой пользователь, но здесь я обнаружил, что мы должны добавить
" + template.id
Итак:
th:checked="${#lists.contains(product.selectedTemplates, '' + template.id)}"Для меня это сработало! Спасибо
Я провел некоторые дальнейшие эксперименты и нашел проблему, где #перечисляет.метод утилиты contains () не работает для одной символьной строки. Я бы добавил, что использую thymeleaf 2.0.19, но также попробовал 2.1.1.Отпустите с тем же результатом.
Я создал простой список в моей модели и добавил некоторые значения:
@FormParam("testList") private List<String> testList = Lists.newArrayList(); testList.add("test1"); testList.add("test2"); testList.add("3"); testList.add("P"); testList.add("33");Затем протестировал списки#.метод contains () выглядит так:
<div th:text="${product.testList}"/> <div th:text="${#lists.contains(product.testList, 'test1')}"/> <div th:text="${#lists.contains(product.testList, 'test2')}"/> <div th:text="${#lists.contains(product.testList, '3')}"/> <div th:text="${#lists.contains(product.testList, 'P')}"/> <div th:text="${#lists.contains(product.testList, '33')}"/>И вывод следующий:
<div>[test1, test2, 3, P, 33]</div> <div>true</div> <div>true</div> <div>false</div> <div>false</div> <div>true</div>Итак, очевидно, что метод не работает для одиночные символьные строки. Поскольку я работаю над новым проектом, я просто сбрасываю последовательности, управляющие этими идентификаторами, так что у меня нет ни одного идентификатора символа для работы. Это, конечно, не то решение, на которое я надеялся, но оно работает. Я также добавлю, что для того, чтобы заставить метод работать в контексте моего вопроса, я должен был добавить пустой символ к моему id следующим образом:
th:checked="${#lists.contains(product.selectedTemplates, '' + template.id)}"Без него метод contains вернул бы "false", потому что template.id это длинный тип.
Как я вижу, ваш selectedtemplates содержит список шаблонов, а не идентификаторы, верно?
Если это так, вы должны проверить список следующим образом:
<input type="checkbox" name="selectedTemplates" th:value="${template.id}" th:checked="${#lists.contains(product.selectedTemplates, template)}" />
Comments