我正在开发一个杂货店列表Web应用程序。一个功能应该是(un)检查列表中找到/购买的项目。显示所有值工作正常。但是,当我检查一些购买的项目上的一些复选框并尝试POST后,spring MVC控制器中的inc @ModelAttribute
为空(除了id)。
我希望你能帮助我。
以下是我的课程:
public class PurchaseList {
private Long id;
private List<PurchaseItem> purchaseItemList;
private DateTime purchaseDate;
private boolean done;
}
public class PurchaseItem {
private Long id;
private String purchaseItemName;
private PurchaseCategory purchaseCategory;
private PurchaseList purchaseList;
private boolean found;
}
控制器:
@RequestMapping(value="/{id}", method=RequestMethod.POST)
public String postPurchaseList(@PathVariable(value="id") Long id, @ModelAttribute("purchaseList") PurchaseList purchaseList, Model model) {
List<PurchaseList> notDonePurchaseList = purchaseListService.getNotDonePurchaseList();
model.addAttribute("notDonePurchases", notDonePurchaseList);
purchaseListService.savePurchaseList(purchaseList);
return "purchaseList";
}
Thymeleaf模板
<form action="#" th:action="@{/purchaseList/{purchaseListId}/(purchaseListId=${purchaseList.id})}" th:object="${purchaseList}" method="post">
<table class="table table-bordered table-hover">
<thead>
<tr>
<td>Found</td>
<td>Item</td>
<td>Category</td>
</tr>
</thead>
<tr th:each="item,status : ${purchaseList.purchaseItemList}">
<td><input type="checkbox" th:checked="${item.found}" th:value="*{purchaseItemList[__${status.index}__].found}" /></td>
<td th:text="${item.purchaseItemName}"></td>
<td th:text="${item.purchaseCategory.categoryName}"></td>
</tr>
</table>
<input type="submit" value="Submit" id="submit" />
</form>
我知道我没有设置其他值(只有found
属性)。或者这是问题吗?
祝你好运
修改
ArrayList
purchaseItemList初始化。现在,空的ArrayList
将返回给控制器。 答案 0 :(得分:1)
初始化PurchaseList类中的purchaseItemList。
public class PurchaseList {
private Long id;
private List<PurchaseItem> purchaseItemList=new ArrayList<>();
private DateTime purchaseDate;
private boolean done;
}
为输入字段指定一个这样的id。
<td><input type="checkbox" th:checked="${item.found}" th:value="* {purchaseItemList[__${status.index}__].found}" th:id='purchaseList.purchaseItemList[__${status.index}__].found'/></td>
答案 1 :(得分:0)
我发现了问题和解决方案。
我在一些教程和博客文章中看到th:field=*{..}
的用法,但我没有使用它,因为我信任Spring Tool Suite(它不提供th:field
属性自动完成。因此我确信此属性不能再使用。但我错了。我将模板代码中的一些*th:value=${..}
属性更改为th:field=*{..}
,如下所示:
<form action="#" th:action="@{/purchaseList/{purchaseListId}/(purchaseListId=${purchaseList.id})}" th:object="${purchaseList}" method="post">
<input type="hidden" th:field="*{id}" />
<input type="hidden" th:field="*{purchaseDate}" />
<input type="hidden" th:field="*{done}" />
<table class="table table-bordered table-hover">
<thead>
<tr>
<td>Found</td>
<td>Item</td>
<td>Category</td>
</tr>
</thead>
<tr th:each="item,status : ${purchaseList.purchaseItemList}">
<td><input type="checkbox" th:checked="${item.found}" th:field="*{purchaseItemList[__${status.index}__].found}" th:id="${'purchaseList.purchaseItemList[__${status.index}__].found' + 'status.index'}"/></td>
<td th:text="${purchaseList.purchaseItemList[__${status.index}__].purchaseItemName}">
<input type="hidden" th:field="*{purchaseItemList[__${status.index}__].purchaseItemName}"
th:value="${purchaseList.purchaseItemList[__${status.index}__].purchaseItemName}"
th:id="${'purchaseList.purchaseItemList[__${status.index}__].purchaseItemName'}"
/>
</td>
<td th:text="${item.purchaseCategory.categoryName}">
<input type="hidden" th:field="*{purchaseItemList[__${status.index}__].purchaseCategory.categoryName}"
th:value="${purchaseList.purchaseItemList[__${status.index}__].purchaseCategory.categoryName}"
th:id="${'purchaseList.purchaseItemList[__${status.index}__].purchaseCategory.categoryName'}"
/>
</td>
</tr>
</table>
<input type="submit" value="Submit" id="submit" />
</form>
现在效果更好。我在控制器中获得“找到”属性。其他值未设置。但我认为我在隐藏的输入字段中弄乱了一些东西。