2013-03-27 42 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" 

捂脸