1

我有一个控制器,它有一个应该采取 POST'ed 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我可以在Request.Form[0]. 但是从我正在阅读的所有其他内容来看,这应该可以正常工作。我不应该自己检索 json 字符串并反序列化它。那么我在这里错过了什么?

4

1 回答 1

3

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

contentType: "application/json"

掌心

于 2013-03-27T20:33:59.903 回答