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 быстро замалчивает этот раздел.
528   4  

4 ответов:

Я задал этот ответ на форуме thymeleaf и получил некоторую помощь, чтобы определить первопричину и разрешение. Видишь [http://forum.thymeleaf.org/Problem-with-thymeleaf-expression-utility-lists-contains-td4027317.html][1]

По существу, одиночные символьные строки по умолчанию интерпретируются как символьный тип и поэтому никогда не совпадают ни с одной из строк в списке. Многозначные строки вычисляются в строковый тип, поэтому работают, как и ожидалось. Путем инкапсуляции при поиске значения в html-кодированных кавычках синтаксический анализатор вынужден оценивать строку с одним символом как строковый тип, а не тип char. Например:
<div th:text="${#lists.contains(testList, &quot;3&quot;)}"/>
<div th:text="${#lists.contains(testList, &quot;P&quot;)}"/>

Просто хотел опубликовать это на случай, если кто-то заинтересуется первопричиной и решением.

Я знаю, что вопрос старый, но я публикую этот ответ, поэтому он может быть полезен другим пользователям, имеющим ту же проблему.

Я не знаю, вы это или другой пользователь, но здесь я обнаружил, что мы должны добавить

" + 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

    Ничего не найдено.