java - Spring /thymeleaf : How to fill a list in form and append another line to the form?

标签 java spring list spring-boot thymeleaf

我有一个对象:

InvoiceData
    String name
    Date date
    List<InvoiceTask>

InvoiceTask 有 3 个字段:

InvoiceTask
    String name
    String project
    BigDecimal hours

我创建了一个 thymeleaf 公式,它创建了一个 InvoiceData 对象并将其保存到我的 MongoDB 实例中,但它只包含 NameDate。我不知道如何修改此表单以不仅添加一个任务,还添加多个任务(可能在表单内使用按钮“添加任务”)。

重定向到 add.html 的 Controller 如下所示:

@RequestMapping(value = "/add/{id}")
public String addPage(@PathVariable("id") String id, Model model) {
    InvoiceData invoiceData = new InvoiceData();
    model.addAttribute("contractorid", id);
    model.addAttribute("invoicedata", invoiceData);
    return "add";
}

保存 InvoiceData 的 Controller 如下所示:

@RequestMapping(value = "/addinvoice/{id}", method = RequestMethod.POST, produces = MediaType.APPLICATION_FORM_URLENCODED_VALUE)
public String addInvoice(@PathVariable("id") String id, InvoiceData data, Model model) {
    Contractor contractor = contractorRepository.findById(id).get();
    data.setData(contractor.getContractorData());
    if (contractor.getInvoices() == null) {
        contractor.setInvoices(new ArrayList<InvoiceData>());
    }
    contractor.getInvoices().add(data);
    invoiceDataRepository.save(data);
    contractorRepository.save(contractor);
    model.addAttribute("contractor", contractor);
    return "index";

InvoiceData 的 Thymeleaf 模板如下所示(它还没有 InvoiceTask 列表!):

<form action="#" th:action="@{addinvoice/{id}(id=${contractorid})}" th:object="${invoicedata}" method="post">
            <ul class="form-style-1">
                <li>
                    <label>Name<span class="required">*</span></label>
                    <input type="text" th:field="*{name}" id="receptionDate">
                </li>
                <li>
                    <label>Date<span class="required">*</span></label>
                    <input type="date" th:field="*{orderDate}" id="orderDate">
                </li>
                <li>
                    <input type="submit" value="Submit" />
                </li>
            </ul>
        </form>

老实说,我不知道从哪里开始...

最佳答案

一种方法是创建一个包装器类(一个 DTO?)来传递要创建的发票及其各自的任务。对于

@RequestMapping(value = "/add/{id}")
public String addPage(@PathVariable("id") String id, Model model) {
    InvoiceDataDTO invoiceData = new InvoiceDataDTO();

    for(int i = 1; i <= 5; i++) {
          invoiceData.addTask(new invoiceTask()) 
    }

    model.addAttribute("invoiceData", invoiceData);
    return "add";
}

在您的 thymleaf 表单中,您必须显示构造的 DTO,如下所示:

    <form action="#" th:action="@{/invoices/save}" th:object="${invoicesData}"
  method="post">
    <fieldset>
        <input type="submit" id="submitButton" th:value="Save">
        <input type="reset" id="resetButton" name="reset" th:value="Reset"/>
        <table>
            <thead>
                <tr>
                    <th> Name</th>
                    <th> Date</th>
                </tr>
            </thead>
            <tbody>
                <tr th:each="invoiceTask, itemStat : *{invoicesTaks}">
                    <td><input th:field="*{invoicesTasks[__${itemStat.index}__].name}" /></td>
                    <td><input th:field="*{invoicesTasks[__${itemStat.index}__].project}" /></td>
                </tr>
            </tbody>
        </table>
    </fieldset>
</form>

如您所见,您获得了已添加空任务的 invoiceDataDTO 的模型属性。

对象填充后你只需要保存。

关于java - Spring /thymeleaf : How to fill a list in form and append another line to the form?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/55489935/

相关文章:

python - 检查序列列表

java - 如何使用 Java 比较器接口(interface)引用另一个具有 id 的列表对对象列表进行排序

java - 代码行的执行顺序

java - 如何使 Apache Common Logging 写入特定的磁盘日志文件

java - org.springframework.web.context.ConfigurableWebApplicationContext.setId(Ljava/lang/String;) 和链式 react

java - 注入(inject)属性文件覆盖应用程序中定义的属性文件

java - 在线程更新时读取 boolean 值数组

java - ArrayIndexOutOfBoundsException : 1. 我的索引有什么问题? java

java - 如何为Azure托管服务指定elasticsearch spring boot配置(无端口)

python - 无法从 Python 进程中返回 append 值