如何设置百里香通:来自其他变量的字段值

时间:2014-07-30 02:23:00

标签: html spring spring-mvc thymeleaf

我有一个简单的文本输入字段,我必须从一个对象设置默认值并将其最终值保存在其他对象中。以下代码无效。

<div th:object="${form}">
    <input class="form-control"
           type="text"
           th:value="${client.name}"  //this line is ignored
           th:field="*{clientName}"/>
</div>

表单是DTO对象,客户端是数据库中的实体对象。

解决这种情况的正确方法是什么?

通过不工作我的意思是 - 假设初始值是client.name =“Foo”和form.clientName = null。  我需要输入字段显示值为“Foo”,并在表单提交form.clientName值后变为“Foo”。但是输入字段没有显示任何内容,并且在提交form.clientName值仍然为null;

如果有人有兴趣,请使用以下结构解决此问题(在另一个问题中找到答案)。

th:attr="value = ${client.name}"

5 个答案:

答案 0 :(得分:39)

你可以采用这种方法。

而不是使用th:field使用html id&amp; name。使用th:value

设置值
<input class="form-control"
           type="text"
           th:value="${client.name}" id="clientName" name="clientName" />

希望这会对你有所帮助

答案 1 :(得分:1)

如果您不必返回页面即可保留表单的值,则可以执行以下操作:

<form method="post" th:action="@{''}" th:object="${form}">
    <input class="form-control"
           type="text"
           th:field="${client.name}"/>

这是一种魔术:

  • 它将设置值= client.name
  • 它将以“名称”字段的形式发送回该值。因此,您必须将表单字段“ clientName”更改为“ name”

如果您要保留表单的输入值,例如页面上出现用户输入错误,那么您将必须这样做:

<form method="post" th:action="@{''}" th:object="${form}">
    <input class="form-control"
           type="text"
           th:name="name"
           th:value="${form.name != null} ? ${form.name} : ${client.name}"/>

这意味着:

  • 表单字段名称为“名称”
  • 如果存在,则从表单中获取值,否则从客户Bean中获取。它将页面上的第一个到达值与初始值相匹配,如果有错误,则将表单输入值相匹配。

无需将客户Bean映射到表单Bean。 它之所以有效,是因为一旦您提交了表单,该值就不会为空,而是“”(空)

答案 2 :(得分:0)

正确的方法是使用preprocessing

例如

th:field="*{__${myVar}__}"

答案 3 :(得分:0)

所以您需要做的是用th:name替换th:field并添加th:value,th:value将具有您要传递的变量的值。

<div class="col-auto">
        <input type="text" th:value="${client.name}" th:name="clientName" 
        class="form control">
</div>

答案 4 :(得分:-4)

它有两种可能的解决方案:

1)您可以通过javascript ...(不推荐)

在视图中进行设置
<input class="form-control"
       type="text"
       id="tbFormControll"
       th:field="*{clientName}"/>

<script type="text/javascript">
        document.getElementById("tbFormControll").value = "default";
</script>

2)或者更好的解决方案是在模型中设置您在控制器的GET操作中附加到视图的值。您还可以更改控制器中的值,只需从$ client.name创建一个Java对象并调用setClientName。

public class FormControllModel {
    ...
    private String clientName = "default";
    public String getClientName () {
        return clientName;
    }
    public void setClientName (String value) {
        clientName = value;
    }
    ...
}

我希望它有所帮助。