我正在使用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调用吗?谢谢!
答案 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 ;并将它们传递给表格,我将它们像隐藏的值一样传递,
<input type="hidden" name="prodls[${status.index}].partNumber" value="${prodsByCat.partNumber}"/>
<input type="hidden" name="prodls[${status.index}].price" value="${prodsByCat.price}"/>
&#13;
所以这是第一个错误,之后我才进入我的模型,但是我没有刷新我希望更新的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);
}
});
&#13;
之后它就到了我的控制器,只刷新了我需要的DIV