ajax更新后不再识别Spring modelattribute

ajax更新后不再识别Spring modelattribute,ajax,spring,spring-boot,thymeleaf,modelattribute,Ajax,Spring,Spring Boot,Thymeleaf,Modelattribute,我多次遇到以下问题: 我使用控制器将dto绑定到html表单(通过thymeleaf)请注意名为“invoiceDto”的型号 问题: 我可以通过Ajax动态添加项目。我序列化整个表单(为了方便起见)并调用控制器方法: @RequestMapping(value = {"/newlineitem"}, method = RequestMethod.POST) public String newLineItem(@ModelAttribute("invoice

我多次遇到以下问题:
我使用控制器将dto绑定到html表单(通过thymeleaf)请注意名为“invoiceDto”的型号

问题:
我可以通过Ajax动态添加项目。我序列化整个表单(为了方便起见)并调用控制器方法:

@RequestMapping(value = {"/newlineitem"}, method = RequestMethod.POST)
    public String newLineItem(@ModelAttribute("invoiceDto") InvoiceDto invoiceDto,
                              Model model)
            throws Exception {
    
        invoiceDto.addItem(new LineItem());
        final Future<InvoiceDto> calculatedInvoiceDto = invoiceService.calculateInvoice(invoiceDto);
        while (!calculatedInvoiceDto.isDone()) {
            Thread.sleep(100);
        }
        model.addAttribute("invoiceDto", calculatedInvoiceDto.get());
        return "invoice/dynamicitems :: lineItems";
    }
然而这是有效的-请注意前缀invoiceDto:

<form action="#" th:action="@{/invoice/newinvoice}" th:object="${invoiceDto}" role="form" method="post"
              class="form-signin" id="editInvoiceForm"
              accept-charset="utf-8">
        <div id="invoiceLineItems"><div th:replace="invoice/items :: lineItems"></div></form>
th:field="*{invoiceDto.items[__${index.index}__].lineItemTotalPrice}"
问题: 这里怎么了?
为什么我必须在部分Ajax更新之后为modelattribute的名称加前缀,而在第一次运行时我不必加前缀

谢谢你的帮助

编辑:
在我的分享中,如果页面通过部分thymeleaf html通过ajax调用(对另一个spring控制器修改invoiceDto)进行部分更新,那么spring似乎会“忘记”最初命名的表单modeldattribute“invoiceDto”

因此,在控制器返回部分thymeleaf视图后,我必须访问前缀为“invoiceDto”的字段,就好像没有invoiceDto属性一样

再次感谢你的帮助

更新
由于在这方面没有进展,我提出了一个问题:

然而,我认为这是一个spring问题,因为我对JSP有相同的结果

存储库来理解此问题

如果我正确理解了您的问题,则在没有活动对象的情况下,您尝试使用
*{}
表示法。当ajax方法只返回“lineItems”片段时,Thymeleaf无法知道它属于一个带有
th:object
的表单

我想最好的解决方案是返回整个表单,然后在js中提取行项目。
或者干脆把
th:object
全部去掉(只有当您想在imho中显示验证错误时才方便)。

可能重复的@BrianClozel谢谢您的建议。这个提示对我不起作用。请查看有关该问题的更新。一方面我制作了一个要克隆的存储库,另一方面我提出了一个thymeleaf问题。奇怪的是我可以使用
*{}
符号。在ajax调用之后(在这里我提交了整个表单,通过控制器中spring的modelattribute类型以正确的方式实现),模型变量就在那里(使用相同的键)。渲染局部视图后,我必须在模型名称前面加上前缀,如:
th:field=“*{invoiceDto.items[\uuuu${index.index}}.\uuu].lineItemTotalPrice}”
public class InvoiceDto implements Serializable {
        private Invoice invoice;
        private List<LineItem> items;
th:field="*{items[__${index.index}__].lineItemTotalPrice}"
@RequestMapping(value = {"/newlineitem"}, method = RequestMethod.POST)
    public String newLineItem(@ModelAttribute("invoiceDto") InvoiceDto invoiceDto,
                              Model model)
            throws Exception {
    
        invoiceDto.addItem(new LineItem());
        final Future<InvoiceDto> calculatedInvoiceDto = invoiceService.calculateInvoice(invoiceDto);
        while (!calculatedInvoiceDto.isDone()) {
            Thread.sleep(100);
        }
        model.addAttribute("invoiceDto", calculatedInvoiceDto.get());
        return "invoice/dynamicitems :: lineItems";
    }
th:field="*{items[__${index.index}__].lineItemTotalPrice}"
th:field="*{invoiceDto.items[__${index.index}__].lineItemTotalPrice}"