Как привязать значения к объекту тимелеафа из html строки таблицы и отправить в spring MVC атрибут modelAttribute контроллера - PullRequest
0 голосов
/ 05 мая 2020

Я новичок в Thymeleaf и пробовал все возможные решения и обходные пути из Интернета. Отчаянно мне нужна помощь, чтобы понять, что здесь не так.

Невозможно получить значение объекта корзины (тимелеафа), обновленное с html до MVC контроллера. вместо этого поля объекта CartViewModel (userI и продукты) в объектах cart и modelMap становятся пустыми. даже он не получает значений, которые я передал для заполнения таблицы в предыдущем вызове.

Любая помощь приветствуется. Заранее благодарим за ваше драгоценное время.

Статус отладки контроллера

Код контроллера:

@Controller
public class MyController {

    @Autowired
    IProductService productService;

    @Autowired
    IVendorService vendorService;

    @RequestMapping(value = "/", method = {RequestMethod.GET})
    public String getVendors(VendorViewModel vendorViewModel, final ModelMap modelMap) {
        modelMap.addAttribute("vendors", vendorService.getVendors());

        return "home";
    }

    @RequestMapping(value = "/inventory", method = {RequestMethod.POST})
    public String getProductsForSelectedVendor(VendorViewModel vendorViewModel, final ModelMap modelMap) {
        modelMap.addAttribute("vendors", vendorService.getVendors());
        modelMap.addAttribute("cart", new CartViewModel("Nish", productService.getProductsByVendor(vendorViewModel.getId())));

        return "home";
    }

    @RequestMapping(value = "/cart", method = {RequestMethod.POST})
    public String saveCart(@ModelAttribute(name = "cart") CartViewModel cart, ModelMap modelMap, BindingResult bindingResult) {

**//not able get cart object value set in html via thymeleaf. **
        return "cart";
    }
}

@Data
@AllArgsConstructor
@NoArgsConstructor
@ToString
@JsonIgnoreProperties(ignoreUnknown = true)
public class CartViewModel {

    private String userId;
    //private List<ProductSelected> products;
    private List<ProductViewModel> products;
}

@Data
@AllArgsConstructor
@NoArgsConstructor
@ToString
@JsonIgnoreProperties(ignoreUnknown = true)
public class ProductViewModel
{

    public String id;
    public int qty = 0;
    public String handle;
    public String title;
    public String bodyHTML;
    public String vendor;
    public String type;
    public String tags;
    public String variantPrice;
    public String imageSrc;
    public String imageAltText;

}

<div class="container-main">
  <form method="POST" enctype="multipart/form-data" th:object="${vendorViewModel}" th:action="@{/inventory}">
    <div>
      <div style="float:left;padding-left:10px;">
        <label for="selectVendor" class="input-label-name">Select Vendor</label>
      </div>
      <div style="float:left;padding-left:10px;">

        <select id="selectVendor" required="required" th:field="*{id}" style="width:90%">
          <option value=""></option>
          <option th:each="vendor, iSat : ${vendors}" th:value="${vendor.id}" th:with="test=${vendor.name}" th:text="${vendor.name}">
          </option>
        </select>
      </div>
      <div style="float:left;padding-left:10px;">
        <input type="submit" value="Get Products" class="btn">
      </div>
    </div>
  </form>
  <form method="POST" action="#" role="form" enctype="multipart/form-data" th:action="@{/cart}" th:object="${cart}">
    <!--                https://stackoverflow.com/questions/49462788/how-to-post-a-list-to-controller-in-thymeleaf-->
    <div style="padding-top: 50px;">

      <table id="productTable" class="tableBodyScroll">
        <tr>
          <th>Quantity</th>
          <th>QtyPrice</th>
          <th>Handle</th>
          <th>Title</th>
          <th>Type</th>
          <th>Tags</th>
          <th>Price</th>
          <th>Image</th>
          <!--                            <th>IN STOCK</th>-->
        </tr>
        <tr th:id="${prod.id}" th:each="prod,iterStat : ${cart.products}" th:class="${iterStat.odd}? 'odd'">
          <td><span class="table-add"><button th:id="'add_' + ${prod.id}" type="button" class="btn btn-rounded btn-sm my-0">+</button></span>
            <span type="text" th:id="'count_' + ${prod.id}" th:field="*{products[__${iterStat.index}__].qty}">0</span>
            <span class="table-remove"><button  th:id="'remove_' + ${prod.id}" type="button" class="btn btn-danger btn-rounded btn-sm my-0">-</button></span>
          </td>
          <td><span th:id="'qtyPrice_' + ${prod.id}">0</span></td>
          <td th:text="${prod.handle}"></td>
          <td th:text="${prod.title}"></td>
          <td th:text="${prod.type}"></td>
          <td th:text="${prod.tags}"></td>
          <td th:id="'price_' + ${prod.id}" th:text="${prod.variantPrice}"></td>
          <td><img height="50px" width="100px" th:src="${prod.imageSrc}" th:title="${prod.title}" th:alt="${prod.imageAltText}" /></td>
          <!--                            <td th:text="${prod.inStock}? #{true} : #{false}">yes</td>-->
        </tr>
      </table>

    </div>
    <div style="float:left;padding-left:10px;">
      <input type="submit" value="Go to Cart" class="btn">
    </div>

  </form>
</div>

1 Ответ

0 голосов
/ 21 августа 2020

Я действительно немного поработал, чтобы решить мою проблему, используя вызов ajax. Но позже я наткнулся на , этот , кажется, лучше подходит для моего сценария. Надеюсь, это кому-то поможет.

...