好吧,我已经看过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;
}
}
的事情是,我想要的name属性是字面上相当于日:字段(即* {year} - > year,* {foo} - > foo等),因为这是Spring数据绑定所必需的。同样设置'name =“year”'不是解决方案,因为th:字段也会自动设置值属性。 – dominik