我有一个控制器,它有一个应该接受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字符串并自行反序列化。那我在这里错过了什么?
答案 0 :(得分:3)
好的,我已修好了。事实证明,尽管Firebug将请求标头显示为application/json
,但您必须通过添加以下内容在AJAX设置中明确设置它们:
contentType: "application/json"
捂脸