【问题标题】:How to set thymeleaf th:field value from other variable如何设置百里香th:来自其他变量的字段值
【发布时间】:2014-09-21 13:29:53
【问题描述】:

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

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

form 是 DTO 对象,client 是数据库中的 Entity 对象。

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

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

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

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

【问题讨论】:

  • 定义“不工作”。 究竟正在发生什么以及应该发生什么?
  • 为什么不用默认值填充模型 - 从而将逻辑从模板移到可能更适合的控制器中?
  • 我想我在这里回答了类似的问题stackoverflow.com/questions/25808433/…

标签: html spring spring-mvc thymeleaf


【解决方案1】:

你可以使用这个方法。

不要使用th:field,而是使用html id & name。使用th:value设置值

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

希望对你有帮助

【讨论】:

  • 指出这将忽略bean绑定。
  • 所以一般来说这是不能做的事情。
  • @JustinSmith 你能详细说明为什么这个解决方案不是正确的方法吗?
  • 这是前段时间,所以它可能不再适用或不再相关,但更详细地说,th:value 将设置输入元素的 value 属性。它不会将表单绑定到 bean,因此如果您更改该字段,然后提交,表单数据将忽略绑定。我最终使用了 th:field 属性,并从控制器设置了默认值。
  • 这是不正确的,它完全没有绑定值的效果
【解决方案2】:

正确的做法是使用preprocessing

例如

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

【讨论】:

    【解决方案3】:

    如果您不必返回页面并保持表单的值,您可以这样做:

    <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。 它之所以有效,是因为一旦您提交了表单,该值就不是 null 而是“”(空)

    【讨论】:

      【解决方案4】:

      所以你需要做的是用 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>
      

      【讨论】:

        【解决方案5】:

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

        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;
            }
            ...
        }
        

        希望对你有帮助。

        【讨论】:

          猜你喜欢
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 2018-01-26
          • 2017-04-01
          • 2023-03-06
          • 2021-02-26
          • 1970-01-01
          相关资源
          最近更新 更多