Thymeleaf + Spring:摆脱默认元素id

时间:2015-06-02 09:34:44

标签: spring spring-mvc thymeleaf

在Thymeleaf(2.1.4.RELEASE)中使用th:field时,有没有办法抑制元素的自动生成ID属性?例如,给定代码:

<input type="text" th:field="*{year}" />

将生成以下HTML:

<input type="text" id="year" name="year" value="" />

我想要实现的是(没有id属性):

<input type="text" name="year" value="" />

在JSP中,它就像设置空ID一样简单:

<form:input path="year" id="" />

但是Thymeleaf只是用默认生成的属性替换了这个空属性。

2 个答案:

答案 0 :(得分:1)

好的,我查看了Thymeleaf(2.1.4.RELEASE)的源代码,负责在Spring方言中设置元素id的方法是调用org.thymeleaf.spring4.processor.attr.SpringInputGeneralFieldAttrProcessor.doProcess(...)的{​​{1}} (source on Github) (source on Github)。如果您查看org.thymeleaf.spring4.processor.attr.AbstractSpringFieldAttrProcessor.computeId(...),您会发现没有简单的方法来设置空ID。

所以我们需要用一种简单的方式来做:)这是:
我创建了一个自定义方言并定义了一个自定义属性computeId(...)。标记看起来像这样:

noid

有一个很棒的tutorial解释如何在Thymeleaf中创建和使用自定义方言,下面是最重要的部分:属性处理器负责从给定元素中删除id属性。

需要注意的重要事项:

  • 高优先级值(9999)保证此处理器将作为最后一个执行(因此执行此处理后,其他处理器不会修改id)
  • 修改类型设置为替换,因此我们完全替换了id元素的值
  • removeAttributeIfEmpty(...)返回true,相当不言自明,如果为空则删除属性
  • getModifiedAttributeValues(...)将id设置为空值,因为上述方法返回true,id属性被删除

代码:

<input type="text" th:field="*{year}" thex:noid="true" />

答案 1 :(得分:0)

如果你不想在输入字段的id中使用它,只需将值分配给th:name字段,

<input type="text" th:name="*{year}" />

会给你输出,

<input type="text" name="2015" />

您可以在末尾使用字符串使id生成与name属性不同,如下所示

<input type="text" th:name="*{year}" th:id="*{year} + '-year' " />

会给你输出,

<input type="text" name="2015" id="2015-year"/>