2017-03-02 72 views
2

我想通過ajax調用我的控制器傳遞一些複雜的數據。通過ajax發送複雜的對象到控制器

我的控制器的操作方法。

public ActionResult CalculatePremium(QuoteDetailsViewModel quoteDetails) 
{ 
    ViewBag.Message = "Your application description page."; 

    return View(); 
} 

Javascript代碼:

quoteDetails = { 
    StartDate: '10-10-2016', 
    Drivers: [{ Name: 'Test', Occupation: 'Test2', 
     DateOfBirth: '10-10-1985'}, { Name: 'Test2', Occupation: 'Test4', 
     DateOfBirth: '10-10-1945' }], 
    Claims: ['5-5-2010'] 
    }; 


    $.ajax({ 
     type: "GET", 
     url: '/Home/CalculatePremium', 
     contentType: "application/json; charset=utf-8", 
     data: quoteDetails, 
     dataType: "json", 
     success: function() { alert('Success'); }, 
     error: function (xhr, status, error) { alert('Error:'); } 
    }); 

視圖模式(不用擔心字符串被用於日期時間 - 它只是用於測試)

public class QuoteDetailsViewModel 
{ 
    public string StartDate { get; set; } 
    public List<Driver> Drivers { get; set; } 
    public List<string> Claims { get; set; } 
} 

public class Driver 
{ 
    public string Name { get; set; } 
    public string Occupation { get; set; } 
    public string DateOfBirth { get; set; } 
} 

當我打電話的動作方法對象被填充以下內容:

{MotorInsuranceCalculator.Models.QuoteDetailsViewModel} 
Claims: null 
Drivers: Count = 2 
StartDate: "10-10-2016" 

quoteDetails.Drivers 
Count = 2 
[0]: {MotorInsuranceCalculator.Models.Driver} 
[1]: {MotorInsuranceCalculator.Models.Driver} 

quoteDetails.Drivers[0] 
{MotorInsuranceCalculator.Models.Driver} 
DateOfBirth: null 
Name: null 
Occupation: null 

quoteDetails.Drivers[1] 
{MotorInsuranceCalculator.Models.Driver} 
DateOfBirth: null 
Name: null 
Occupation: null 

任何幫助解決這個將不勝感激。

+1

'data:JSON.stringify({quoteDetails:quoteDetails})',它需要是一個POST,而不是一個GET –

+0

當我將其更改爲POST時,出現內部服務器錯誤,爲什麼? – Grentley

+1

你必須爲你的方法使用'[HttpPost]'動詞。 –

回答

4

contentType是您發送的數據類型,所以application/json;缺省值是application/x-www-form-urlencoded;字符集= UTF-8。

如果使用application/json,則必須使用JSON.stringify()才能發送JSON對象。

JSON.stringify()將javascript對象轉換爲json文本並將其存儲在字符串中。

$.ajax({ 
    type: "POST", 
    url: '/Home/CalculatePremium', 
    contentType: "application/json; charset=utf-8", 
    data: JSON.stringify(quoteDetails), 
    dataType: "json", 
    success: function() { alert('Success'); }, 
    error: function (xhr, status, error) { alert('Error:'); } 
}); 

而且,你必須使用HttpPost動詞,以執行post請求。

[HttpPost] 
public ActionResult CalculatePremium(QuoteDetailsViewModel quoteDetails) 
{ 
    ViewBag.Message = "Your application description page."; 
    return View(); 
} 
+0

這很好用! – Grentley

+0

當然,謝謝! – Grentley

2

我想你必須做JSON.stringify(quoteDetails),以將其作爲一個JSON對象。

另外,請確保您在服務器端收到它時解析json。

+3

不需要解析(這一切都由'DefaultModelBinder'完成) –

相關問題