在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);
希望这可以帮到你:)