【问题标题】:How to get not editted object from form with spring如何使用弹簧从表单中获取未编辑的对象
【发布时间】:2021-01-13 15:44:55
【问题描述】:

我的应用程序中有一个用于结帐的简单控制器
一开始,我们只是将订单对象转移到表单中:

@GetMapping
    public String getOrderForm(Model model){
        model.addAttribute("orderForm", new OrderDto());
        model.addAttribute("deliveryType", orderService.getDeliveryTypeList());
        model.addAttribute("paymentType", orderService.getPaymentTypeList());
        return "create-order";
    }

之后,用户在这个对象中填写了2个字段,都进入了下面的方法:

    @PostMapping
    public String addNewOrder(@ModelAttribute("orderForm") @Valid OrderDto orderDto,
                              @AuthenticationPrincipal UserDetails currentUser,
                              BindingResult bindingResult,
                              Model model,
                              RedirectAttributes redirectAttributes){
        User userFromBd = userRepository.findByEmail(currentUser.getUsername());
        orderDto.setUser_id(userFromBd.getId());
        List<AddressDto> savedAddress = addressService.getAllSaved(orderDto.getUser_id());
        model.addAttribute("savedAddress", savedAddress);
        model.addAttribute("addressForm", new AddressAdditionDto());
        return "order-address";
    }

这里我们将其他对象传递到表单中,让用户填写。这就是表单的样子:

<!DOCTYPE html>
<html lang="en" xmlns:th="http://www.w3.org/1999/xhtml">
<head>
    <meta charset="UTF-8">
    <title>Add new order</title>
</head>
<body>
    <div th:each="address : ${savedAddress}">
        <p>
            <span th:text="*{address.country}"></span>
        </p>
        <p>
            <span th:text="*{address.city}"></span>
        </p>
    </div>

    <form th:method="POST" th:action="@{/order/savedaddress}">
        <td>Choose adress:</td>
        <select name="addressId">
            <span th:each="address : ${savedAddress}">
                   <option th:value="${address.id}"
                           th:text="${address.id}"></option>
            </span>
        </select>
        <br>
        <label>
            <input name="submit" type="submit" value="Select"/>
        </label>
    </form>
<p><a href="/">Home</a></p>
</body>
</html>

在这种形式中,与我们原来的 OrderDTO 对象没有交互。此表单中的所有数据均采用以下方法:

    @PostMapping("/savedaddress")
    public String addAddress(@ModelAttribute("orderForm") @Valid OrderDto orderDto,
                             @RequestParam(value = "addressId", required = false) Long addressId,
                             BindingResult bindingResult,
                             Model model){
        model.addAttribute("orderForm", orderDto);
        if(orderDto.getPaymentType().equals("CARD")) {
            model.addAttribute("savedCard", cardService.getAllByUserId(orderDto.getUser_id()));
            model.addAttribute("cardForm", new CardRegisterDto());
            return "order-card";
        }
        return "order-finish";
    }

但问题是我的 OrderDTO 对象已经完全空了这个方法。即之前表格中已经填写的字段为空。可以连接什么?

【问题讨论】:

    标签: html spring model controller thymeleaf


    【解决方案1】:

    我认为您没有在 HTML 文件中使用 OrderDto 对象,这可能是获取空对象作为 ModelAttribute 的原因。您可以在表单中使用 th:object 喜欢:

     <form th:method="POST" th:action="@{/order/savedaddress}" th:object="${orderForm}">
      <input type="hidden" th:field="*{user_id}">
       '''
        other code
       ''' 
    </form>
    

    【讨论】:

      【解决方案2】:

      添加注解@SessionAttributes (types = {OrderDto.class}) 高于班级

      【讨论】:

        【解决方案3】:

        试试这个:

        <form th:method="POST" th:action="@{/order/savedaddress} th:object={orderForm}">
            <input type="hidden" th:value="${orderForm.user_id} name=userId">
            <td>Choose adress:</td>
            <select name="addressId">
                <span th:each="address : ${savedAddress}">
                       <option th:value="${address.id}"
                               th:text="${address.id}"></option>
                </span>
            </select>
            <br>
            <label>
                <input name="submit" type="submit" value="Select"/>
            </label>
        </form>
        

        【讨论】:

          猜你喜欢
          • 2014-11-06
          • 1970-01-01
          • 2017-02-09
          • 2021-04-29
          • 2021-08-15
          • 1970-01-01
          • 2011-06-08
          • 1970-01-01
          • 1970-01-01
          相关资源
          最近更新 更多