2012-03-04 32 views
13

JQuery mã:đèo đối tượng nhiều JSON để phương pháp hành động 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 Mã (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; } 
    } 

Bây giờ vấn đề là, tôi không thể làm cho nó làm việc bằng cách đi qua "CategoryMode "," ProductModel "vào phương thức hành động" ModelTwo ". Bài đăng JQuery xác định chính xác phương thức hành động "ModelTwo" nhưng giá trị thuộc tính "cat", "prd" không có giá trị. "CategoryID", "CategoryName", "ProductID", "ProductName" đều là null mặc dù nhấn phương thức đó.

 

    //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); 
       } 
      }); 
     }); 

Vì vậy, có gì sai với lời gọi JQuery đầu tiên của tôi đối với phương thức hành động "ModelTwo"?

Tôi đã dành rất nhiều thời gian để tìm hiểu điều này, nhưng không chắc chắn điều gì đang xảy ra. Không có vấn đề gì với định tuyến ở đây vì tôi có thể truy cập đúng phương thức hành động ...

Bất kỳ trợ giúp nào sẽ được đánh giá cao.

Cảm ơn!

Trả lời

34

Bạn có thể gửi cho họ như yêu cầu 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); 
    } 
}); 

Các JSON.stringify phương pháp mà tôi đang sử dụng trong ví dụ của tôi là tự nhiên tích hợp trong tất cả các trình duyệt hiện đại nhưng nếu bạn cần hỗ trợ trình duyệt cũ bạn có thể bao gồm các json2.js kịch bản cho trang của bạn.

này nên ràng buộc một cách chính xác để các hành động sau đây:

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

Nhưng tôi sẽ khuyên bạn nên xác định một mô hình điểm:

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

và sau đó đã hành động điều khiển của bạn có mô hình quan điểm này:

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

và dĩ nhiên mã phía máy khách vẫn giữ nguyên.

+0

Điều này thật tuyệt vời !!!!!! Nó đã làm việc. Nó đã làm việc tốt mà không có "ContentType" thiết lập cho phiên bản tham số duy nhất, nhưng tăng gấp đôi. Thay đổi duy nhất tôi phải thực hiện là làm cho việc xâu chuỗi dữ liệu được truyền đi như bạn đã đề cập thay vì toàn bộ mô hình chính nó "JSON.stringify ({cat: CategoryModel, prd: ProductModel})" đã giúp rất nhiều. Bạn đã làm Darin ngày của tôi! Cảm ơn bạn rất nhiều! –

+0

Tôi đã làm cho nó hoạt động bằng cách có một lớp bao bọc có "get set" của Category và Product class. Nó đã được làm việc tốt cho phiên bản tham số duy nhất nhưng khi tôi vượt qua hai tham số. Nhưng dù sao, đề xuất của bạn đã giúp, tôi đã phải thêm contentType để là json cho hai phương thức hành động được tham số hóa. Cảm ơn bạn! –

+0

Tính năng này có hoạt động trong Firefox không? Nó hoạt động trong IE tốt nhưng firefox. Nó không phải là đích trong bộ điều khiển hành động, khi tôi sử dụng fiddler để tìm hiểu dữ liệu nào đang được chuyển tới bộ điều khiển, chỉ cần để trống. BTW, phương pháp hành động điều khiển của tôi nằm trong các dự án khác nhau, do đó, nó được đăng qua miền. Nó hoạt động tốt miễn là phương thức hành động có một tham số nhưng hai tham số. Đã xảy ra sự cố khi truyền dữ liệu đến miền điều khiển chéo. –

-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 
Các vấn đề liên quan