2012-03-04 60 views
13

jQuery代碼:傳遞多個JSON對象MVC3操作方法

 

    //This passes NULL for "CategoryID", "CategoryName", "ProductID", "ProductName" 
    $("#btnPost").click(function() { 
      var CategoryModel = { 
       CategoryID: 1, 
       CategoryName: "Beverage" 
      }; 
      var ProductModel = { 
       ProductID: 1, 
       ProductName: "Chai" 
      }; 
      var data1 = {}; 

      data1["cat"] = CategoryModel; 
      data1["prd"] = ProductModel; 

      var jsonData = JSON.stringify(data1); 

      $.ajax({ 
       url: url + '/Complex/ModelTwo', //This works but property values are null 
       type: 'post', 
       dataType: 'json',   
       data: { "cat": CategoryModel, "prd": ProductModel }, //jsonData, 
       cache: false, 
       success: function (result) { 
        alert(result); 
       }, 
       error: function (xhr, ajaxOptions, thrownError) { 
        alert(thrownError); 
       } 
      }); 
     }); 

MVC代碼(C#):

 public class ComplexController : Controller 
    { 
     public string ModelOne(Category cat) 
     { 
      return "this took single model..."; 
     } 

     public string ModelTwo(Category cat, Product prd) 
     { 
      return "this took multiple model..."; 
     } 
    } 
    public class Category 
    { 
     public int CategoryID { get; set; } 
     public string CategoryName { get; set; } 
    } 
    public class Product 
    { 
     public int ProductID { get; set; } 
     public string ProductName { get; set; } 
    } 

現在的問題是,我無法得到它通過傳遞工作「CategoryMode 「,」ProductModel「轉換爲」ModelTwo「動作方法。 JQuery post正確地標識了動作方法「ModelTwo」,但「cat」,「prd」屬性值爲null。 「類別ID」,「類別名稱」,「產品ID」,「產品名稱」均爲空,儘管碰到該方法。

 

    //THIS ONE WORKS FINE... 

    $("#btnPost").click(function() { 
      var CategoryModel = { 
       CategoryID: 1, 
       CategoryName: "Beverage" 
      }; 
      var ProductModel = { 
       ProductID: 1, 
       ProductName: "Chai" 
      }; 
      var data1 = {}; 

      data1["cat"] = CategoryModel; 
      data1["prd"] = ProductModel; 

      var jsonData = JSON.stringify(data1); 

      $.ajax({ 
       url: url + '/Complex/ModelOne', //This works 
       type: 'post', 
       dataType: 'json',   
       data: CategoryModel, 
       cache: false, 
       success: function (result) { 
        alert(result); 
       }, 
       error: function (xhr, ajaxOptions, thrownError) { 
        alert(thrownError); 
       } 
      }); 
     }); 

那麼,我的第一個JQuery調用「ModelTwo」動作方法有什麼問題?

我花了很多時間搞清楚這一點,但不知道發生了什麼事。這裏沒有路由問題,因爲我可以登陸正確的行動方法...

任何幫助將不勝感激。

謝謝!

回答

34

你可以向他們發送的JSON請求:

var categoryModel = { 
    categoryID: 1, 
    categoryName: "Beverage" 
}; 
var productModel = { 
    productID: 1, 
    productName: "Chai" 
}; 
$.ajax({ 
    url: '@Url.Action("ModelTwo")', 
    type: 'post', 
    dataType: 'json', 
    // It is important to set the content type 
    // request header to application/json because 
    // that's how the client will send the request 
    contentType: 'application/json', 
    data: JSON.stringify({ cat: categoryModel, prd: productModel }), 
    cache: false, 
    success: function (result) { 
     alert(result); 
    }, 
    error: function (xhr, ajaxOptions, thrownError) { 
     alert(thrownError); 
    } 
}); 

JSON.stringify方法,我用我的例子是原生內置的所有現代瀏覽器,但如果你需要支持舊版瀏覽器,你可以包括json2.js腳本到你的頁面。

這應該正確地綁定到以下行動:

[HttpPost] 
public ActionResult ModelTwo(Category cat, Product prd) 
{ 
    return Json(new { message = "this took multiple model..." }); 
} 

但我會建議你定義一個視圖模型:

public class MyViewModel 
{ 
    public Category Cat { get; set; } 
    public Product Prd { get; set; } 
} 

,然後讓你的控制器動作持這種觀點的模型:

[HttpPost] 
public ActionResult ModelTwo(MyViewModel model) 
{ 
    return Json(new { message = "this took a single view model containing multiple models ..." }); 
} 

當然客戶端代碼保持不變。

+0

這太棒了!!!!!!有效。沒有單個參數版本的「ContentType」設置,它工作得很好,但是雙倍。我必須做的唯一改變是使數據的字符串化像你提到的那樣傳遞,而不是整個模型本身「JSON.stringify({cat:CategoryModel,prd:ProductModel})」幫助了很多。你讓我的一天達林!非常感謝! – 2012-03-04 22:30:37

+0

我知道它有一個包裝類,它具有Category和Product類的「get set」。對於單參數版本它工作得很好,但是當我傳遞兩個參數時。但無論如何,你的建議幫助,我不得不添加contentType爲兩個參數化操作方法的json。謝謝! – 2012-03-04 22:36:46

+0

這工作在Firefox?它在IE瀏覽器工作得很好,但Firefox。它沒有在動作控制器中着陸,當我使用Fiddler找出數據傳遞給控制器​​時,只是空白。順便說一下,我的控制器操作方法駐留在不同的項目中,所以它跨域發佈。只要action方法只有一個參數,但只有兩個參數,它就可以工作。將數據傳遞給控制器​​跨域時出錯。 – 2012-03-05 20:36:44

-1
var a = $("#a").serialize(); 
      var b = $("#b").serialize(); 
      var c = $("#c").serialize(); 


    $.ajax(
      { 
       url: '@Url.Content("~/Controller/Method1")', 
       type: 'POST', 
       data: a+b+c, 
    success: function (success) { 
    // do something 
    } 

    }); 

    // in Controller 
    [HttpPost] 
    public ActionResult Method1(abc a, bcd b, xyz c) 
    { 
    } 

// where abc, bcd xyz are class 
相關問題