好的,我查看了 Thymeleaf (2.1.4.RELEASE) 的源代码,在 Spring 方言中负责设置元素 id 的方法是 org.thymeleaf.spring4.processor.attr.SpringInputGeneralFieldAttrProcessor.doProcess(...) (source on Github) 调用 org.thymeleaf.spring4.processor.attr.AbstractSpringFieldAttrProcessor.computeId(...) (source on Github)。如果你看computeId(...),你会发现没有简单的方法来设置空id。
所以我们需要用一种不简单的方式来做这件事:) 这里是:
我创建了一个自定义方言并定义了一个自定义属性noid。标记如下所示:
<input type="text" th:field="*{year}" thex:noid="true" />
有一个很棒的tutorial 解释了如何在 Thymeleaf 中创建和使用自定义方言,下面是最重要的部分:负责从给定元素中删除 id 属性的属性处理器。
需要注意的重要事项:
- 高优先级值 (9999) 保证此处理器将作为最后一个处理器执行(因此在此处理器执行后其他处理器不会修改 id)
- 修改类型设置为替换,所以我们完全替换了 id 元素的值
- removeAttributeIfEmpty(...) 返回 true,不言自明,如果为空则删除属性
- getModifiedAttributeValues(...) 设置 id 为空值,由于上述方法返回 true,id 属性被删除
代码:
public class NoIdAttrProcessor extends AbstractAttributeModifierAttrProcessor {
public NoIdAttrProcessor() {
super("noid");
}
@Override
public int getPrecedence() {
return 9999;
}
@Override
protected ModificationType getModificationType(Arguments arguments, Element element, String attributeName, String newAttributeName) {
return ModificationType.SUBSTITUTION;
}
@Override
protected boolean removeAttributeIfEmpty(Arguments arguments, Element element, String attributeName, String newAttributeName) {
return true;
}
@Override
protected boolean recomputeProcessorsAfterExecution(Arguments arguments, Element element, String attributeName) {
return false;
}
@Override
protected Map<String, String> getModifiedAttributeValues(Arguments arguments, Element element, String attributeName) {
Map<String, String> values = new HashMap<>(1);
values.put("id", "");
return values;
}
}