java—如何将从一个arraylist生成的复选框中的值发布到另一个在thymeleaf和spring中具有表单的对象arraylist?

mznpcxlj  于 2021-06-27  发布在  Java
关注(0)|答案(1)|浏览(351)

我有一个表单,它接受用户的几个输入来创建一个对象,其中一个输入是一组复选框。
复选框是从 Model 带着一个 ArrayListGrape 名为“grapelist”的对象,但我无法确定如何将它们添加到提交表单时创建的对象中。
我的表格如下:

<form class="col-12" action="#" th:action="@{/admin}" th:object="${Wine}" method="post">
        <div class="row">
            <div class="col-1">
                <label for="nameInput">Name: </label>
            </div>
            <div class="col-11">
                <input class="w-100" id="nameInput" type="text" th:field="*{name}">
            </div>
        </div>
            <div class="col-1">
                <label for="descriptionInput">Description: </label>
            </div>
            <div class="col-11">
                <textarea class="w-100" id="descriptionInput" type="text" th:field="*{description}"></textarea>
            </div>
        </div>
====================PROBLEM=======================
        <div class="row" th:each="grape: ${GrapeList}">
            <div class="col">
                <label th:for="'grape' + ${grape.name}" th:text="${grape.name}"></label>
            </div>
            <div class="col">
                <input type="checkbox" th:id="'grape' + ${grape.name}" th:value="${grape.id}" th:field="*{grapes.add()}">
            </div>
        </div>
====================PROBLEM=======================

        <button class="btn btn-outline-success" type="submit" value="Submit">Save</button>
    </form>

窗体正在创建 Wine 具有 ArrayListGrape 被称为“葡萄”的物体。其他输入字段工作正常,但我不知道如何绑定arraylist为每个复选框添加grape对象。。这个 th:field="*{grapes.add()}" 只是为了描述我想做的事。。
感谢您的帮助!

u2nhd7ah

u2nhd7ah1#

添加 name 属性,例如“grape”。因此,它们都将以相同的名称生成。提交带有此类复选框的表单时,浏览器会为每个选中的复选框重复发送所选名称的值,如 grape=first&grape=third&grape=extra 在控制器中捕获此数据。这可以通过几种方式实现。
直接从获取参数 HttpServletRequest :

@RequestMapping(path="/admin", method=RequestMethod.POST)
public void formSubmitted(HttpServletRequest request){
  Map<String, String[]> allParams = request.getParameterMap(); // fetch all params 
  String[] grapes = request.getparameterValues("grape");       // or just grapes
}

使用 @RequestParam 注解

@RequestMapping(path="/admin", method=RequestMethod.POST)
public void formSubmitted(@RequestParam MultiValueMap<String, String> allParams,
                          @RequestParam(name="grape", optional=true) List<String> grapes){
  // your code
}

不确定是否有可能将这个构造直接Map到对象的字段,但似乎可以通过调整springmvc来实现这一点。

相关问题