map表单与thymeleaf和spring绑定(更新Map条目)

kzmpq1sx  于 2021-06-30  发布在  Java
关注(0)|答案(0)|浏览(243)

我正在为我的大学做一个项目,我们必须使用spring和thymeleaf。我有一个包含Map的窗体类。Map的键是可以购买的项目,值是用户想要购买的每个项目的编号。
我正在尝试根据用户的输入更改Map的值。例如,如果用户的输入如下所示:

然后,在用户单击submit按钮(该按钮通过post请求将项目添加到虚拟购物车)之后,Map应该包含条目<kaeseplatte,2>和<schinkenplate,3>。
据我所知,post请求按预期工作,只是map的值没有更新,因此添加到cart的项目数始终为0。
到目前为止,我已经把自己的方向放在以下问题上,试图解决我的问题,但我还不能完全弄清楚:
Map窗体绑定
thymeleaf+spring boot-如何使用map字段为对象创建窗体
Spring通过Map形成
这是我的课程表:

public class PSForm extends OrderForm {

    private Map<CatalogItem, Integer> platten = new HashMap<>();

    public PSForm() {
        setName("Partyservice");
    }

    public Map<CatalogItem, Integer> getPlatten() {
        return platten;
    }

    public void setPlatten(Map<CatalogItem, Integer> platten) {
        this.platten = platten;
    }

这是我的控制器类:

@Controller
@SessionAttributes("warenkorb")
public class BestellungController {

    private ArrayList<Event> events;
    private Event currentEvent;

    @Autowired
    private KatalogVerwaltung katalogVerwaltung;
    @Autowired
    private InventarVerwaltung inventarVerwaltung;

    BestellungController() {
        events = new ArrayList<Event>();
    }

    @ModelAttribute("warenkorb")
    public Cart initializeCart() {
        return new Cart();
    }

    //katalogVerwaltung.getPSMap() just returns a map with all values set to 0.
    @ModelAttribute("partyServiceForm")
    public PSForm initializePS() {
        PSForm pSForm = new PSForm();
        pSForm.setPlatten(katalogVerwaltung.getPSMap());
        return pSForm;
    }

    @PreAuthorize("isAuthenticated()")
    @PostMapping("/warenkorb")
    String addEvent(@ModelAttribute("partyServiceForm") PSForm pSForm, @ModelAttribute("warenkorb") Cart warenkorb) {

            currentEvent = new Partyservice(pSForm);
            events.add(currentEvent);

            for (Entry<CatalogItem, Integer> item : pSForm.getPlatten().entrySet()) {
                inventarVerwaltung.add(item.getKey(), item.getValue());
                warenkorb.addOrUpdateItem(item.getKey(), Quantity.of(item.getValue()));
            }
     }
}

这是我的表单模板,它生成上图中的表单:

<form method="post" th:action="@{/warenkorb}" th:object="${partyServiceForm}">
        <input type="hidden" name="type" value="Partyservice"/>
        <div class="box">
          <h2 class="small-header">Auswahl Platten</h2>
          <p class="hint">Bitte geben Sie folgende Informationen an.</p>
          <div th:each="catalogitem : ${partyServiceForm.platten}">
            <div>
                <label for="item" th:text="${catalogitem.key.name}">Anzahl</label>
                <input class="text-input" id="item" type="number" name="item" min="0" max="20" step="1" value="0" th:field="*{platten['__${catalogitem.value}__']}"/>
            </div><br>
        </div>
   </form>

如果有人想看,我可以添加katalogverwaltung.getpsmap()的代码。我只是选择省略它,因为这已经是很多代码了。
我希望这不是复制品,如果是的话我很抱歉。我看到的其他问题也有帮助,但我仍在努力理解如何使用表单更新容器。
感谢您抽出时间阅读本文。

暂无答案!

目前还没有任何答案,快来回答吧!

相关问题