2015-06-02 60 views
0

在Thymeleaf(2.1.4.RELEASE)中使用th:field时,是否有任何方法可以抑制元素的自动生成ID属性?例如,给定代码:Thymeleaf + Spring:摆脱默认元素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="" /> 

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

回答

1

好吧,我已经看过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; 
     } 

    } 
0

如果你不想使用这个在你的ID输入字段只值分配给只有日:名称字段,

<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"/> 
+0

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