2016-09-25 62 views
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"); 
     } 
    }) 
} 
+1

只是试图删除的contentType。并尝试使用控制台进行调试,它真的在传递给ajax之前jquery上 –

+0

@Loading ..我删除了contentType,现在工作,为什么?你可以发表一个答案,我会接受它 – AlexGH

+0

检查我的答案,我已经回答你的原因。 –

回答

2

删除contentType w为你工作不好。

contentType是您要发送的数据类型,所以application/json; charset = utf-8是一个常见的应用程序/ x-www-form-urlencoded; charset = UTF-8,这是默认值。

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

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

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

希望这有助于你:)