2017-02-24 72 views
6

場景:傳遞數據

需要通過其中包含的子對象的控制器列表的對象。

問題:

我能夠獲得對象的價值而不是對象內部子對象列表的價值。

代碼:

index.cshtml

function sendData() { 
    var student = { 
     Id: 1, 
     Name: "xxx", 
     Marks: [{ 
      Subject: "Maths", 
      Mark:80 
     }, 
     { 
      Subject: "Science", 
      Mark: 75 
     }] 
    } 
    $.ajax({ 
     url: '@Url.Action("Receive", "Home")', 
     data: student, 
     success: function (data) { 
      alert("done"); 
     }, 
     error: function (error) { 
      alert('error For details refer console log'); 
      console.log(error); 
     } 
    }); 
} 

HomeController.cs

public ActionResult Receive(Student student) 
    { 
     ViewBag.Message = "Your contact page."; 
     return View(); 
    } 

Student.cs

public class Student 
{ 
    public int Id { get; set; } 
    public string Name { get; set; } 
    public List<Marks> Marks { get; set; } 
} 
public class Marks 
{ 
    public string Subject { get; set; } 
    public decimal Mark { get; set; } 
} 

截圖:

Chrome的調試器顯示的所有數據都設置。

enter image description here

但在控制器我沒有收到商標

任何幫助的

enter image description here

值,將不勝感激。謝謝。

回答

5

您需要字符串化的數據,並設置contentTypetype AJAX選項(請注意,它需要一個帖子,否則你需要生成使用帶有點符號完全合格的屬性名你以不同的方式的數據 - 爲例如{ Id: 1, .... , 'Marks[0].Subject': 'Maths', 'Marks[0].Mark': 80, ... },在這種情況下,其現有的Ajax代碼無需修改工作)

var student = { 
    .... 
}; 

$.ajax({ 
    url: '@Url.Action("Receive", "Home")', 
    data: JSON.stringify({ student: student }, // stringify 
    type: 'POST', // add 
    contentType: "application/json; charset=utf-8", //add 
    success: function (data) { 
     alert("done"); 
    }, 
    .... 
}); 

請注意,您的方法返回一個視圖,但是你沒有做這個觀點東西。如果您的意圖是用該視圖更新DOM,那麼該方法應爲return PartialView(...);,並在ajax成功回調中,

success: function (data) { 
    $(someElement).html(data); 
}, 
+0

謝謝@Stephen。完美的作品。只是好奇,爲什麼它不在GET方法中工作? –

+1

由於GET調用沒有主體,並且值來自查詢字符串(或路由值),並且'DefaultModelBinder'無法匹配您發送的數據(查看您生成的要了解的URL)。 –

+1

但是,如果按照第一段中的註釋對數據進行格式化,即它的名稱與您在c#代碼中訪問屬性值時使用的格式相同,那麼它就會起作用。 –