2012-04-05 61 views
2

我目前正在嘗試從我的視圖發佈JSON對象到我的控制器在MVC 3應用程序,我期待從請求的數據綁定到模型我的控制器動作參數。但是,當我檢查HTTP POST請求時,它看起來像是作爲查詢字符串傳遞的數據,我不確定爲什麼(對於所有這些都很新穎)。MVC 3試圖從視圖發送JSON對象到模型

這裏是我的POST請求:

$.ajax({ 
     type: 'POST', 
     url: "Test/Add", 
     data: { Name: name, Age: age }, 
     success: function (data) { 
      console.log("success"); 
     }, 
     error: function (xhr, data, message) { 
      console.log(data + ": " + message); 
     }, 
     dataType: "json" 
    }); 

下面是從我的控制器代碼後跟模型我試圖綁定到代碼:

[HttpPost] 
    public ActionResult Add(PersonModel person) 
    { 
     System.Threading.Thread.Sleep(1000); 

     return View(); 
    } 

    // person model: 
    public class Person { 

     public string Name {get;set;} 
     public int Age {get;set;} 

    } 

這是小提琴手請求 - 我突出了我不確定的部分:

enter image description here

我想內容類型將是「應用/ JSON」,並且數據不會看起來像一個查詢字符串 - 我認爲這將是這個樣子:

{ 
    Name: "James", 
    Age: 13 
} 

最終的問題是,如果我堅持一個我的控制器操作中的斷點我期望看到一個填充的Person對象,但它始終爲空。如果我將簽名替換爲(object name, object age),那麼我將得到參數的值(兩者都是一個字符串數組 - 所以name是一個帶有1個元素的字符串數組,它等於「James」)。

任何想法,我哪裏出錯了?

哦,只是供參考,我其實不是13!那些是我捏造的第一批數字。

謝謝!

詹姆斯

回答

2

@大衛是在正確的,你需要設置的contentType爲「應用/ JSON的」。但是你也需要發送JSON。你正在發送一個對象。要將其轉換爲JSON,請使用JSON.stringify。我嘗試將它作爲具有此contentType設置的對象發送並收到服務器錯誤。我實際上沒有設置contentType就能正常工作。即使請求遇到「Name = James & Age = 13」,MVC也能夠將其轉換爲對象。我修改了測試,將結果作爲JSON回顯並顯示出來。

下面是修改的控制器

 [HttpPost] 
    public string Add(PersonModel person) 
    { 
     JavaScriptSerializer serializer = new JavaScriptSerializer(); 
     string result = serializer.Serialize(person); 

     return result; 
    } 

    // person model: 
    public class PersonModel 
    { 

     public string Name { get; set; } 
     public int Age { get; set; } 

    } 

修飾的Javascript和HTML看起來像這樣:

<input id="doAjax" type="button" value="Send Json..."/> 
<br /> 
Results:<br /> 
<textarea id="results" cols="30" rows="3"></textarea> 
<script type="text/javascript"> 

$(document).ready(function() { 
    $("#doAjax").click(sendJson); 
}); 

function sendJson() { 
    var name = "James"; 
    var age = "13"; 
    var person = { Name: name, Age: age }; 
    var personJson = JSON.stringify(person); 
    $.ajax({ 
     type: 'POST', 
     url: "Test/Add", 
     data: personJson, 
     contentType: 'application/json', 
     success: function (data) { 
      var jsonStr = JSON.stringify(data); 
      $("#results").val(jsonStr); 
     }, 
     error: function (xhr, data, message) { 
      var jsonStr = JSON.stringify(data); 
      $("#results").val(jsonStr + ": " + message); 
     }, 
     dataType: "json" 
    }); 
} 

下面是一些測試的結果:

數據=人; contentType =未設置; request =「Name = James & Age = 13」; response =「{」Name「:」James「,」Age「:13}」

data = personJson; contentType =未設置; request =「{」Name「:」James「,」Age「:」13「}」; response =「{」Name「:null,」Age「:0}」

data = person; contentType ='application/json'; request =「Name = James & Age = 13」; response =「System.ArgumentException:無效的JSON基元:名稱」

data = personJson; contentType ='application/json'; request =「{」Name「:」James「,」Age「:」13「}」;響應= 「{」 名稱 「:」 詹姆斯 「 」年齡「: 」13「}」

注意,當將contentType沒有設置默認爲 '應用程序/ x-WWW窗體-urlencoded'

+0

改變我選擇的答案,因爲這是一個更完整的解決方案和一個工作示例。實際上,我自己使用@Davids貢獻加上更多的Google搜索,但是如果我想先嚐試一下,那麼我會更快。乾杯 - 詹姆斯 – 2012-04-05 14:13:27

+0

可能是正確的選擇 - 凱文明確指出我錯過了關於JSON有效載荷的串化。 – 2012-04-05 14:29:29

1

dataType傳遞給$.ajax是預期的響應類型。您需要添加contentType以指定有效內容類型。

$.ajax({ 
    type: 'POST', 
    url: "Test/Add", 
    data: { Name: name, Age: age }, 
    contentType: 'application/json' //********* 
    success: function (data) { 
     console.log("success"); 
    }, 
    error: function (xhr, data, message) { 
     console.log(data + ": " + message); 
    }, 
    dataType: "json" 
}); 

Here's the jQuery documentation.ajax(),表示默認的contentType是「應用/的X WWW的形式,進行了urlencoded」

相關問題