在ajax中传递参数获取null值

我正在使用ajax调用一个动作控制器,但是当动作控制器收到它时,我传递的data属性参数总是为空……这里可能发生什么?

JQuery函数:

 function PostOrder() { var id = $(".aslink").data("customerid"); var url = $("#btnAddOrderPost").data("url_add_order"); $.ajax({ type:"post", url: url, data: JSON.stringify( { orderVM: $("#frmCreatePV").serialize()}), datatype: "json", contentType: "application/json", success: function () { alert("it was inserted"); } }) } 

动作控制器:

 [HttpPost] // [ValidateAntiForgeryToken] public ActionResult CreatePV(OrderVM orderVM) { if (ModelState.IsValid) { List top = new List(); decimal tempPrice = 0M; for (int i = 0; i < orderVM.Toppings.Count; i++) { if (orderVM.Toppings[i].IsSelected == true) { top.Add(orderVM.Toppings[i].SpecificTopping); tempPrice += orderVM.Toppings[i].Price; } } Order order = new Order { Toppings = top, TotalPrice = tempPrice }; db.Orders.Add(order); db.SaveChanges(); return RedirectToAction("Index"); } return View(orderVM); } 

这是OrderVM ViewModel我正在使用这种类型的参数:

 public class OrderVM { public virtual List Toppings { get; set; } public decimal TotalPrice { get; set; } } 

这是包含在部分视图中的表单:

 @using (Html.BeginForm(null,null,FormMethod.Post, htmlAttributes: new { @id="frmCreatePV"})) { @Html.AntiForgeryToken() 
@Html.ValidationSummary(true, "", new { @class = "text-danger" })
@{ for (int i = 0; i < Model.Toppings.Count; i++) {
@Html.HiddenFor(model => model.Toppings[i].SpecificTopping) @Html.CheckBoxFor(model => model.Toppings[i].IsSelected, htmlAttributes: new { data_price = Model.Toppings[i].Price, @id = "chbkPrice" }) @Html.HiddenFor(model => model.Toppings[i].Price) @Html.LabelFor(model => model.Toppings[i].IsSelected , Model.Toppings[i].SpecificTopping)

Price: @Model.Toppings[i].Price

} }
}

UPDATE

最后,这就是行动控制员的表现:

  [HttpPost] [ValidateAntiForgeryToken] public JsonResult CreatePV(OrderVM orderVM) { int id = Convert.ToInt32(TempData["License"]); if (ModelState.IsValid) { List top = new List(); decimal tempPrice = 0M; for (int i = 0; i  c.LicenseNumber == id).First(), LicenseNumber = id, Toppings = top, TotalPrice = tempPrice }; db.Orders.Add(order); db.SaveChanges(); return Json(new { success= true, JsonRequestBehavior.AllowGet}); } return Json(new { success = false, JsonRequestBehavior.AllowGet}); } 

和JQuery函数一样,请注意我使用serializeArray()将一个元素添加到未绑定到html表单的数据中:

 function PostOrder() { var orderVM = {}; id = $(".aslink").data("customerid"); alert($("#btnGetOrderAdd").data("customerid")); var url = $("#btnAddOrderPost").data("url_add_order"); var datavar = $("#frmCreatePV").serializeArray(); datavar.push({name: "LicenseNumber" ,value : id}) $.ajax({ type:"post", url: url, data: datavar, datatype: "json", success: function () { alert("it was inserted"); } }) } 

删除contentType将适合您。

contentType是您要发送的数据类型,因此application / json; charset = utf-8是常见的,就像application / x-www-form-urlencoded一样; charset = UTF-8,这是默认值。

使用contentType: 'application/json'您将无法依赖$ _POST进行填充。 $ _POST仅填充表单编码的内容类型。

在这种情况下,您可以访问PHP原始数据。

 $input = file_get_contents('php://input'); $object = json_encode($input); 

希望这可以帮到你:)