Spring MVC 如何从其他变量设置thymeleaf th:字段值

7kqas0il  于 2022-11-15  发布在  Spring
关注(0)|答案(6)|浏览(265)

我有一个简单的文本输入字段,我必须从一个对象设置默认值,并将其最终值保存在另一个。

<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是数据库中实体对象

解决这种情况的正确方法是什么?
不工作的意思是-让我们说,初始值是client.name =“Foo”和form.clientName=null。我需要输入字段显示值是“Foo”和表单提交后form.clientName值成为“Foo”。但输入字段显示什么,并在提交form.clientName值仍然是null;
如果有人感兴趣,请使用以下结构解决此问题(在另一个问题中找到答案)。

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

4uqofj5v1#

你可以采用这种方法。
使用html idname代替th:field。使用th:value设置值

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

希望这对你有帮助

qncylg1j

qncylg1j2#

正确的方法是使用预处理
比如说
th:field="*{__${myVar}__}"

uttx8gqw

uttx8gqw3#

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

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

这是某种魔法:

  • 它将设置值= client.name
  • 它会将表单中的值作为“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}"/>

这意味着:

  • 表单字段名称为'name'
  • 如果表单存在,则从表单中获取值,否则从客户端bean中获取值。客户端bean将第一次到达的页面与初始值进行匹配,如果存在错误,则表单输入值。

而不必将客户端beanMap到表单bean。它之所以有效,是因为一旦提交了表单,值就不是null而是“”(空)

vd8tlhqk

vd8tlhqk4#

好吧,如果我理解正确的问题,你是试图分配一个预定义的值给一个变量,然后填充该变量到html表单,当它是由Thymeleaf呈现.如果这是你所问的,我一直在挣扎,以及几天,刚刚找到答案后,阅读您的帖子,并认为我会分享.
我所做的(希望这能帮助一些人)是试图自动为我的blog帖子的id赋值,这样当用户提交它时,blog帖子将自动获得我想要赋值的ID。

***我遇到的问题**当我像这样{ th:field="{id}”}分配id变量时,表单输入框中的输出总是“0”。所以我尝试了各种不同的方法来解决这个问题,比如添加一个th:value和一个th:name,结果总是大的“0”。

所以,经过大量的敲打我的头,并通过论坛搜索来短,我发现这个小金块的喜悦。
https://frontbackend.com/thymeleaf/hidden-inputs-in-thymeleaf
虽然它没有解决我的具体问题,但答案就在里面。我不会让你自己读,因为我讨厌这样。

*答案

{In HTML表单}

<input class="form-control" type="text" id="blog-id"  th:field="*{id}">

{In控制器}
@GetMapping(“/”)公共字符串显示(Model模型){

// Create the object first 
    BlogPost blogPost = new BlogPost();

   // Then add assign the value to object
    blogPost.setId( Value You Want To Add );

   // Then send the object that you added the id to as the attribute
    model.addAttribute("blogPost", blogPost);


    return "postBlog";
}

***结论***我把代码精简到你需要看到的程度(在所有的仇恨者开始之前)。这就是我的解决方案,它完美地工作了。不,我们都知道如何解决这个问题

干杯! java 埃迪

xggvc2p6

xggvc2p65#

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

k4ymrczo6#

有两种可能的解决方案:
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;
    }
    ...
}

希望能帮上忙。

相关问题