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

时间:2016-09-17 04:06:52

标签: ajax spring null form-submit

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

  

<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;
	}

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

2 个答案:

答案 0 :(得分:0)

这是你应该在模型中传递属性的方法:

假设您要为页面加载页面/请求,该网页包含以下网址: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";
}

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

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

现在,假设您填写了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方法,并且在将数据放入JSP之后,将尝试使用POST请求将原始空属性值从GET请求绑定到car参数。

答案 1 :(得分:0)

我发现问题是什么,忘记发布答案之前,我实际上并未提交模型,因为我在该模型中有一个产品列表,我使用varStatus =&#34; status&#34 ;并将它们传递给表格,我将它们像隐藏的值一样传递,

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

所以这是第一个错误,之后我才进入我的模型,但是我没有刷新我希望更新的DIV,而是将我重定向到页面视图,所以我不得不修改我的ajax调用,如下所示:

&#13;
&#13;
$(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);
	}	
});
&#13;
&#13;
&#13;

之后它就到了我的控制器,只刷新了我需要的DIV