在服务器端,我有以下课程
public class EditorContext
{
public Module Module { get; set; }
public Holder Holder { get; set; }
}
public class Module
{
public string CodeName { get; set; }
public string Content { get; set; }
}
public class Holder
{
public int Id { get; set; }
public int Type { get; set; }
}
public class EditorController : Controller
{
[HttpPost]
public ActionResult AddModule(EditorContext context)
{
return Json(new { });
}
}
从客户端我发送这样的请求
var data =
{
Module:
{
CodeName: 1,
Content: 2
},
Holder:
{
Type: 3,
Id: 4
}
};
$.ajax({
type: "POST",
url: 'Editor/AddModule',
data: JSON.stringify(data),
async: false,
success: function () {
},
error: function (xhr, status, error) {
throw new Error();
}
});
1 - Fiddler表示他发送了 {&#34; Module&#34;:{&#34; CodeName&#34;:1,&#34; Content&#34;:2},&#34 ;持有人&#34;:{&#34;输入&#34;:3,&#34; Id&#34;:4}} ,但在服务器 Request.Form =%7b%22Module% 22%3A%7B%22CodeName%22%3A1%2C%22Content%22%3A2%7D%2C%22Holder%22%3A%7B%22Type%22%3A3%2C%22Id%22%3A4%7D%7D < / strong>,为什么?
2 - 如果不是&#34; JSON.stringify(数据)&#34;我使用&#34; postify&#34;就像在here中一样,所以EditorController.AddModule已经填充了EditorContext。此 postify 将数据更改为&#34; Model.CodeName = 1&amp; Model.Content = 2&amp; Holder.Type = 3&amp; Holder.Id = 4&#34;。那么,为什么以这种方式使用默认的binder自动填充EditorContext,并且在(1)中它没有?
谢谢
答案 0 :(得分:2)
你需要告诉绑定器你的数据是JSON,否则它不知道它应该解析它。在您的请求中添加正确的内容类型标题:
$.ajax({
type: "POST",
url: 'Editor/AddModule',
data: JSON.stringify(data),
contentType: "application/json",
async: false,
success: function () {
},
error: function (xhr, status, error) {
throw new Error();
}
});