无法解析为赋值表达式:" $ {attrs?:defaultAttrs}"

时间:2016-06-21 03:26:18

标签: spring spring-mvc spring-boot thymeleaf

以下百里叶标记我错过了什么:

<tr th:fragment="row" th:with="defaultAttrs='placeholder=\'' + ${placeholder} + '\''">                            
    <td>
        <input th:attr="${attrs ?: defaultAttrs}" />
    </td>
    ...
</tr>

来自

<th:block th:include="row::row(attrs='value=\'*{prodName}\', minLength=\'.{2, 16}\', required, title=\'starts with an alphabet 2 and 8\' placeholder=\'Product name\'')" />

产生此错误:

Could not parse as assignation sequence: "${attrs ?: defaultAttrs}"

在不相关的说明中,必须对异常消息进行双重处理,以便有意识地使用单词assignation而不是赋值

1 个答案:

答案 0 :(得分:2)

您正尝试将文字字符串传递给th:attr。 Thymeleaf期待表达,但不是字符串。下一个例子不起作用,但这是你要做的:

<input th:attr="${'placeholder=\'defaultPlaceholder\''}" />

我建议你下一步:

<tr th:fragment="row" th:with="defaultPlaceholder='placeholder', defaultMaxlength=10">                            
    <td>
        <input th:attr="placeholder=${placeholder?:defaultPlaceholder},
            maxlength=${maxlength?:defaultMaxlength}" />
    </td>
    ...
</tr>

它看起来更长,但可以让您更好地控制管理属性。

已更新:如果您希望在一个字符串变量中传递所有属性,则可以使用Thymeleaf的preprocessing。例如,下一个代码就是如何在页面中使用片段:

<div th:include="fragment :: row(attrs='value=\'*{prodName}\', minLength=\'.{2, 16}\', 
    required=true, title=\'starts with an alphabet 2 and 8\', placeholder=\'Product name\'')">

那么你的片段会是这样的:

<div th:fragment="row"> 
    <div th:with="defaults='placeholder=\'placeholder\', maxlength=10'" th:remove="tag">
        <tr>                            
            <td>
                <input th:if="${attrs!=null}" th:attr="__${attrs}__"/>
                <input th:if="${attrs==null}" th:attr="__${defaults}__"/>
            </td>
            ...        
        </tr>
    </div>
</div>

说明:

  • 片段的主标签不会包含在结果页面中。因此,请勿使用<tr>作为主标记。而是将<tr>包裹到<div>
  • 传递给fragment的参数将覆盖在fragment主标签的th:with中声明的所有变量。因此,如果您想将任何参数传递给片段,请不要在片段的主标签中声明th:with。做它片段的主体。
  • 如果您不需要在结果页中输出某些标签,只需使用th:remove attribute即可。此属性允许您删除片段的一部分。在此示例中,我们使用第二个<div>来声明th:with,我们在结果页中不需要此<div>

attr th:include参数中有错误。因为属性是名称和值的对,所以不能仅指定required。你必须写:required=true。另一个错误:您错过了titleplaceholder之间的逗号。正确的字符串应该是下一个:

<th:block th:include="row::row(attrs='value=\'*{prodName}\', minLength=\'.{2, 16}\', 
    required=true, title=\'starts with an alphabet 2 and 8\', placeholder=\'Product name\'')" />