无法让控制器将JSON解析回模型

时间:2013-03-27 18:07:59

标签: json asp.net-mvc-4

我有一个控制器,它有一个应该接受POST的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字符串并自行反序列化。那我在这里错过了什么?

1 个答案:

答案 0 :(得分:3)

好的,我已修好了。事实证明,尽管Firebug将请求标头显示为application/json,但您必须通过添加以下内容在AJAX设置中明确设置它们:

contentType: "application/json"

捂脸