56

Here's my code, where I'm iterating through:

<tr th:each="category : ${categories}">
     <td th:text="${category.idCategory}"></td>
     <td th:text="${category.name}"></td>
     <td>
         <a th:href="@{'/category/edit/' + ${category.id}}">view</a>
     </td>
</tr>

The URL it points to is supposed to be /category/edit/<id of the category>, but it says it could not parse the expression:

Exception evaluating SpringEL expression: "category.id" (category-list:21)

Stu Furlong
  • 3,490
  • 5
  • 34
  • 47
user962206
  • 15,637
  • 61
  • 177
  • 270

12 Answers12

109

The right way according to Thymeleaf documention for adding parameters is:

<a th:href="@{/category/edit/{id}(id=${category.idCategory})}">view</a>
Mario Rojas
  • 1,313
  • 1
  • 9
  • 15
60

I think your problem was a typo:

<a th:href="@{'/category/edit/' + ${category.id}}">view</a>

You are using category.id, but in your code is idCategory, as Eddie already pointed out.

This would work for you:

<a th:href="@{'/category/edit/' + ${category.idCategory}}">view</a>
Sae1962
  • 1,122
  • 15
  • 31
cralfaro
  • 5,822
  • 3
  • 20
  • 30
29

A cleaner and easier way to do this

<a href="somepage.html" th:href="@{|/my/url/${variable}|}">A Link</a>

I found this solution in Thymeleaf Documentation on "4.8 Literal substitutions".

douglasmiguel7
  • 391
  • 3
  • 2
  • Very nice. I hope people see this answer - this is far nicer and more compact than the other approaches listed here, avoiding the need for '...' or duplicating the names with the the (...) link syntax – Ben Spiller Jun 08 '23 at 17:49
14

Your code looks syntactically correct, but I think your property doesn't exist to create the URL.

I just tested it, and it works fine for me.

Try using category.idCategory instead of category.id, for example…

  <tr th:each="category : ${categories}">
    <td th:text="${category.idCategory}"></td>
    <td th:text="${category.name}"></td>
    <td>
      <a th:href="@{'/category/edit/' + ${category.idCategory}}">view</a>
    </td>
  </tr>
Sae1962
  • 1,122
  • 15
  • 31
Eddie Jaoude
  • 1,698
  • 15
  • 23
5

I was trying to go through a list of objects, display them as rows in a table, with each row being a link. This worked for me. Hope it helps.

// CUSTOMER_LIST is a model attribute
<table>
    <th:block th:each="customer : ${CUSTOMER_LIST}">
        <tr>
            <td><a th:href="@{'/main?id=' + ${customer.id}}" th:text="${customer.fullName}" /></td>
        </tr>
    </th:block>
</table>
Shahriar
  • 303
  • 4
  • 12
4

I think you can try this:

<a th:href="${'/category/edit/' + {category.id}}">view</a>

Or if you have "idCategory" this:

<a th:href="${'/category/edit/' + {category.idCategory}}">view</a>
4

You can use like

  1. My table is bellow like..

    <table>
       <thead>
        <tr>
            <th>Details</th>
        </tr>
    </thead>
    <tbody>
        <tr th:each="user: ${staffList}">
            <td><a th:href="@{'/details-view/'+ ${user.userId}}">Details</a></td>
        </tr>
     </tbody>
    </table>
    
  2. Here is my controller ..

    @GetMapping(value = "/details-view/{userId}")
    public String details(@PathVariable String userId) { 
    
        Logger.getLogger(getClass().getName()).info("userId-->" + userId);
    
     return "user-details";
    }
    
Enamul Haque
  • 4,789
  • 1
  • 37
  • 50
3

You can use:

html:

 <html xmlns:th="http://www.thymeleaf.org">

<a th:href="@{'/category/'+ ${item.idCategory}}">View</i></a>

Controller: @PathVariable String parentId

General Grievance
  • 4,555
  • 31
  • 31
  • 45
Lâm Hồ
  • 39
  • 1
2

"List" is an object getting from backend and using iterator to display in table

"minAmount" , "MaxAmount" is an object variable "mrr" is an just temporary var to get value and iterate mrr to get data.

<table class="table table-hover">
<tbody>
<tr th:each="mrr,iterStat : ${list}">
        <td th:text="${mrr.id}"></td>
        <td th:text="${mrr.minAmount}"></td>
        <td th:text="${mrr.maxAmount}"></td>
</tr>
</tbody>
</table>
0

try this one is a very easy method if you are in list of model foreach (var item in Modal) loop

<th:href="/category/edit/@item.idCategory>View</a>"

or

<th:href="/category/edit/@item.idCategory">View</a>

Sneha
  • 1
  • 1
0

You can also use ${yourVariable} for exampe <th:href="/category/edit/__${yourVariable}__">View</a>

0

Hi you can use thymeleaf preprocessing :

<tr th:each="category : ${categories}">
    <td th:text="${category.idCategory}"></td>
    <td th:text="${category.name}"></td>
    <td>
        <a th:href="@{__${category.idCategory}__}">view</a>
    </td>
 </tr>
rbs228
  • 1
  • 1