2
我打电话给一个动作控制器使用ajax但我传递的参数data
属性总是为空当动作控制器收到它... 这里可能发生了什么?传递参数在ajax中获得空值
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<string> top = new List<string>();
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视图模型我使用这种类型的参数:
public class OrderVM
{
public virtual List<ToppingVM> Toppings { get; set; }
public decimal TotalPrice { get; set; }
}
这是包含在部分视图中的表格:
@using (Html.BeginForm(null,null,FormMethod.Post, htmlAttributes: new { @id="frmCreatePV"}))
{
@Html.AntiForgeryToken()
<div class="form-horizontal">
@Html.ValidationSummary(true, "", new { @class = "text-danger" })
<div class="form-group">
@{
for (int i = 0; i < Model.Toppings.Count; i++)
{
<div class="col-xs-4">
@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)
<p>Price: @Model.Toppings[i].Price</p>
</div>
}
}
</div>
<div class="form-group">
<div class="col-md-10">
<input type="button" value="Add order" id="btnAddOrderPost" class="btn btn-primary"
data-url_add_order="@Url.Action("CreatePV", "Orders")" />
</div>
</div>
</div>
}
UPDATE
最后是这样的动作控制器如何留:
[HttpPost]
[ValidateAntiForgeryToken]
public JsonResult CreatePV(OrderVM orderVM)
{
int id = Convert.ToInt32(TempData["License"]);
if (ModelState.IsValid)
{
List<string> top = new List<string>();
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
{
Customer = db.Customers.Where(c => 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。并尝试使用控制台进行调试,它真的在传递给ajax之前jquery上 –
@Loading ..我删除了contentType,现在工作,为什么?你可以发表一个答案,我会接受它 – AlexGH
检查我的答案,我已经回答你的原因。 –