Spring / MVC Thymeleaf th:选择不工作

时间:2015-08-25 14:31:56

标签: spring-mvc thymeleaf

我正在使用Spring,Hibernate以及Thymeleaf构建应用程序以获取视图。该应用程序以Activity域类为中心(实际上是由俱乐部成员组织的室内或室外活动)。该类有几个查找字段(类别区域),它们被建模为由Hibernate映射到数据库查找表的域类。

在编辑视图页面中,我会显示一个下拉框,以便能够选择查找值,还必须使用所选属性显示当前值。 这里出错了。尽管布尔表达式看起来是正确的,但从不生成select属性。

添加th:attr以显示比较表达式的值,即$ {choice.id}和* {category.id}这些值是正确的。我添加了readonly属性(不适合选择元素,但只是为了讨论是否可能是th:selected属性的问题),我们在输出中看到此属性是在输出中生成的!

<label>Categorie</label>
<select th:field="*{category}">
  <option th:each="choice : ${allCategories}" 
          th:value="${choice.id}" 
         th:attr="choiceid=${choice.id}, categoryid=*{category.id}, showselected=(${choice.id} == *{category.id})" 
         th:selected="(${choice.id} == *{category.id})" 
         th:readonly="(${choice.id} == *{category.id})" 
         th:text="${choice.description}"></option>
</select>

HTML输出:

<label>Categorie</label>
<select id="category" name="category">
  <option choiceid="1" categoryid="2" showselected="false" value="1">Actief en sportief</option>
  <option choiceid="2" categoryid="2" showselected="true" readonly="readonly" value="2">Uitgaan en nachtleven</option>
  <option choiceid="3" categoryid="2" showselected="false" value="3">Kunst en cultuur</option>
  <option choiceid="4" categoryid="2" showselected="false" value="4">Eten en drinken</option>
  <option choiceid="5" categoryid="2" showselected="false" value="5">Ontspanning en gezelligheid</option>
</select>

所以我的追求归结为:为什么 已选择=&#34;已选择&#34;

没有为id = 2的选项元素生成?

当然可以通过使用th:attr表达式生成来实现,但根据文档,它应该以这种方式工作。

此外,我试图绕过使用特殊的th:selected属性并使用th:attr为所选选项生成所选属性(值&#39; none&#39;是临时用于清晰度&#39; ):

th:attr =&#34; selected =($ {choice.id} == * {category.id})? &#39;选择&#39; :&#39;无&#39;&#34;

同样,没有显示任何内容,也没有呈现所选属性。我尝试重复的是使用自定义属性名称(所选单词的荷兰语翻译,当然不为Thymeleaf所知):

th:attr =&#34; geselecteerd =($ {choice.id} == * {category.id})? &#39;选择&#39; :&#39;无&#39;&#34;

现在它被渲染了!请参阅以下输出:

<select id="category" name="category">
  <option geselecteerd="none" value="1">Actief en sportief</option>
  <option geselecteerd="selected" value="2">Uitgaan en nachtleven</option>
  <option geselecteerd="none" value="3">Kunst en cultuur</option>
  <option geselecteerd="none" value="4">Eten en drinken</option>
  <option geselecteerd="none" value="5">Ontspanning en gezelligheid</option>
</select>

我现在真的迷失了,所选择的属性是完全合法的,这是唯一的选择,但似乎Thymeleaf忽略了它。 怎么解决这个?

6 个答案:

答案 0 :(得分:7)

根据百里香论坛论坛(postth:field不适用于th:selected

尝试这样的事情(未经测试)

<select name="category">
    <option th:each="choice : ${allCategories}" 
     th:value="${choice.id}" 
     th:attr="choiceid=${choice.id}, categoryid=*{category.id}, showselected=(${choice.id} == *{category.id})" 
     th:selected="(${choice.id} == *{category.id})" 
     th:readonly="(${choice.id} == *{category.id})" 
     th:text="${choice.description}"></option>
</select>

答案 1 :(得分:2)

' th:field '会自动生成'id'和'name'属性,因此如果你想使用'th:selected',你应该删除'th:field'并手动设置他们工作。

我遇到了同样的问题并查看了论坛,' th:selected '和' th:field '不能同时运行。 check the forum

<div class="row">
<div class="input-field col s12">
    <select id="doc" name="doc" th:with="doc=*{doc}">
                    <option value="" th:disabled="disabled" selected="true"
                       th:text="${status==true}? 'Seleccione tipo de documento' : ${doc}">Seleccione
                       tipo de documento</option>
                    <option th:each="tipoDoc : ${tipoDocs}" th:text="${tipoDoc}"
                       th:value="${tipoDoc}" />
              </select>
    <label>Documento</label>
</div>

答案 2 :(得分:1)

我知道有点晚了。但是任何正在寻找解决方案的人...

要使用* {fieldname}选择选项,应使用带有两个大括号的th:value

<select th:field="*{roadmap}" required>
<option th:each="rm : ${roadmaps}" th:value="${{rm}}" th:text="${rm.title}">
</option>
</select>

您需要添加格式器:

public class RoadmapFormatter implements Formatter<Roadmap> {
    @Override
    public Roadmap parse(String id, Locale locale) throws ParseException {
        Roadmap r = new Roadmap();
        r.setId(Long.parseLong(id));
        return r;
    }

    @Override
    public String print(Roadmap r, Locale locale) {
        return String.valueOf(r.getId());
    }
}

最后但并非最不重要的是在配置类中注册格式化程序:

@Configuration
public class Configuration implements WebMvcConfigurer {

    @Override
    public void addFormatters(FormatterRegistry formatterRegistry) {
        formatterRegistry.addFormatter(new RoadmapFormatter());
    }
}

答案 3 :(得分:0)

我发现当我想编辑一个项目时,百里香会自动选择,它加载了带有预定义值的表单,我的代码如下:

<select th:field="*{type}" class="form-control" name="stockType">
<option value="1">Type1</option>
<option value="2">Type2</option>
<option value="4">Type4</option></select>

像魅力一样工作

答案 4 :(得分:0)

此解决方案对我有用

<div class="form-group">
<label>Employee's Status</label>
<select id="statusid" name="statusid" th:field="*{statusid}" class="form-control col-md-7 col-xs-12"  required="true" />
<option th:value="''" th:text="Select"></option>
<option th:each="i : ${allStatus}" th:value="${i.id}" th:text="${i.statusname}" th:selected="${i.id} == ${employee.statusid}"></option>
</select>
</div>

答案 5 :(得分:0)

---------entity------
public class ProductType {
@Id
@GeneratedValue(strategy = GenerationType.IDENTITY)
@Column(name = "TypeId")
private Integer typeId;

//Categories ID
@ManyToOne
@JoinColumn(name = "CatId")
private Categories categories;

---------html-------

<select th:field="*{categories.catId}" >
                                
    <option   th:each="c: ${listCat}" th:value="${c.catId}"
             th:text="${c.catName}" >
     </option>

</select>

试试这个。它和我一起工作