2013-03-27 51 views
1

我有一個控制器,有一個應該採取POST'ed JSON對象中的動作:無法獲取控制器解析JSON回模型

[HttpPost] 
public ActionResult EditProject(ProjectDetails project) 
{ 
    return Json(project); 
} 

然而,實際上得到返回的是一個新的,空的項目對象。它似乎並沒有用ID以外的其他東西填充項目對象(例如,來自url mywebsite/mycontroller/EditProject/3)。

ProjectDetails物體看起來是這樣的:

public class ProjectDetails 
{ 
    public int ID { get; set; } 
    public string Name { get; set; } 
    public DateTime Date { get; set; } 
    public List<Factor> factors { get; set; } 

    public ProjectDetails() 
    { 
     factors = new List<Factor>(); 
    } 

    public ProjectDetails(Project p) 
    { 
     ID = p.PrjID; 
     Name = p.Name; 
     Date = p.PrjDate; 
     factors = p.factors; 
    } 
} 

和JavaScript代碼後看起來像這樣:

function save() { 
     var data = { 
      ID: 4, 
      Name: "foo", 
      Date: Date.now(), 
      factors: [] 
     }; 

     $.ajax(window.location.href, { 
      type: "POST", 
      dataType: "json", 
      data: JSON.stringify({ project: data }), 
      success: function() { 
       alert("done"); 
      } 
     }); 
    } 

我已經對這個有變化瞎搞了幾個小時它固執地忽略我發送的發佈數據,而是建立一個新的ProjectDetails而只定義了ID

任何想法?

我甚至嘗試過使用GET請求產生的JSON數據到同一個控制器並直接發送它(所以它必須是正確的格式,對嗎?),它仍然忽略它。

更新

望着這多一點,我的請求被髮送爲application/json,但是當我設置在我的控制器一個破發點,並檢查請求,這是application/x-www-form-urlencoded,我可以找到我的JSON字符串在Request.Form[0]。但從我讀的其他東西,這應該只是工作。我不應該檢索json字符串並自己反序列化它。那麼我在這裏錯過了什麼?

回答

3

好的,我已修復它。原來,儘管螢火蟲顯示請求頭爲application/json,你必須真正明確設置他們在您的AJAX設置加入:

contentType: "application/json" 

捂臉