提交表单 ajax,在控制器中接收空值

submit form ajax, receive null value in controller

我正在使用 ajax 向 spring 控制器提交表单,但是当它到达我的控制器时我得到一个空模型,我在这里添加我的代码:

  

<script>
$(document).ready(function() {
 $('#partsForm').submit(
  function(event) {
var str = $("#partsForm").serialize();
$.ajax({
 type : "POST",
 url : $("#partsForm").attr("action"),
 data : str,
 dataType: "json",
 contentType: "application/json"
});

return false;
  });
 });
</script>

<form:form id="partsForm" method="post" modelAttribute="modelpartsForm" class="form-horizontal" role="form"  action="${pageContext.request.contextPath}/jsp/search/productConfig.html">
  <div class="form-group">
  <table class="table table-hover" width="50%" align="right">
    <thead>
      <tr>
      <th></th>
        <th>Part number</th>
        <th>Price</th>
        <th>Stock</th>
        <th>Qty</th>
      </tr>
    </thead>
    <tbody>
      <c:if test="${!empty partsForm.prodls}">
      <c:forEach items="${partsForm.prodls}" var="prodsByCat">
      <tr>
      <td></td>
       <td>${prodsByCat.partNumber} ${prodsByCat.description}</td>
       <td>${prodsByCat.price}</td> 
       <td>${prodsByCat.quantity}</td> 
      <td>
      <input type="NUMBER" MIN="0" MAX=${prodsByCat.quantity} STEP="2" VALUE="0" SIZE="3">
      </td>
 </tr>
      </c:forEach> 
       <tr>
      <td colspan="5">
      <button type="submit" class="btn btn-info">add parts</button>
      </td>
 </tr>
      </c:if>
    </tbody>
  </table>
  </div>
</form:form>

这是我的控制器

 @RequestMapping(value="/productConfig",method = RequestMethod.POST)
 @ResponseBody
 public ModelAndView currentquote(@ModelAttribute("partsForm") PartsFormDTO partsForm) {
   ModelAndView modelView = new ModelAndView();
....do some logic
   return modelView;
 }

调试时我只得到一个空的 partsForm,我应该更改我的 ajax 调用吗?谢谢!

这是在模型中传递属性的方式:

假设您要为页面加载 page/request,该页面具有 URL:http://localhost:8080/carApp/add

现在,为了将其与模型中的属性相关联,您应该有一个知道接受对上述 URL 的请求的控制器。这意味着您应该有一个带有下一个的控制器:@RequestMapping(value="/add")

现在,我可以在其中创建一个新对象并将其作为属性绑定到模型。像这样:

@RequestMapping(value="/add",method=RequestMethod.GET)
public String addCar(Model model){

    model.addAttribute("car", new Car());

    return "car_add";
}

这只是尝试将数据绑定到该汽车属性的准备工作。

在上面,您可以看到每当我 GET 请求 /add 路由时,我都会将一个新的 Car 对象附加到模型,您可以使用它JSP 文件中的汽车对象,借助表达式语言 以便将数据绑定到它。

现在,假设您填写了 JSP 表单,目的是将数据绑定到 JSP 文件中的 Car 属性。

当您 POST 向控制器请求该表单时,您将能够在控制器内的另一个方法上使用 @ModelAttribute 并实际执行该绑定。像这样:

@RequestMapping(value="/add", method=RequestMethod.POST)
public String saveCar(@ModelAttribute Car car){
    /*** some manipulation on car object ***/
    System.out.println("saving car");
    return "car_add";
}

那个 POST 请求将到达 saveCar 方法,并会尝试将 GET 请求中的原始空属性值绑定到带有 POST 请求的 car 参数,然后将数据放入其中你的 JSP.

我发现了问题所在,忘记了 post 之前的答案,我实际上并没有提交模型,因为我在该模型中有一个产品列表,我使用 varStatus="status" 并将它们传递到表单中,我像传递隐藏值一样传递它们,

   <input type="hidden" name="prodls[${status.index}].partNumber" value="${prodsByCat.partNumber}"/>
      <input type="hidden" name="prodls[${status.index}].price" value="${prodsByCat.price}"/>
 

所以这是第一个错误,在那之后我进入了我的模型,但我没有刷新我想更新的 DIV,而是将我重定向到页面视图,所以我不得不修改我的ajax 打电话,像这样:

$(document).ready(function() {
 $('#partsForm').submit(
  function(event) {
   var partsForm = "${partsForm}";

var str = $("#partsForm").serialize();
$.ajax({
 url : $("#partsForm").attr("action"),
 data : str,
 type : "POST",
 success : function(response) {
  $("#prodConfig").html(response);
 },
 error : function(xhr, status, error) {
  alert("ERROR:"+xhr.responseText);
 } 
});

之后它进入我的控制器并仅刷新我需要的DIV