为什么postify工作和stringify不?

时间:2011-05-01 12:47:28

标签: ajax asp.net-mvc json jquery

在服务器端,我有以下课程

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)中它没有?

谢谢

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();
        }
});