2011-11-18 73 views
4

我有以下域模型定义:从jquery的AJAX传递复杂对象行动在asp.net MVC

public class myModel { 
     public string Prop1 {get;set;} 
     public string Prop2 {get;set;} 
     public List<myClass> ListofStuff {get;set;}   
    } 


    public myClass { 
     public string Id{get;set;} 
     public string Name{get;set;} 
    } 

然后我已经定义了控制器动作如下:

[HttpPost] 
    public ActionResult Save(MyModel someModel) 
    { 
     //do the saving 
    } 

我请从我的JS代码上面的动作使用jQuery AJAX

var someModel = { Prop1: "somevalue1", 
        Prop2: "someothervalue", 
        ListofStuff: [{Id: "11", Name:"Johnny"}, {Id:"22", Name:"Jamie"}] 

      };  

$.ajax({ 
     contentType: 'application/json, charset=utf-8', 
     type: "POST", 
     url: "/myController/Save", 
     data: JSON.stringify({someModel: someModel}), 
     cache: false, 
     dataType: "json", 

     success: function() { 

      alert('success!'); 
     }, 

     error: function (XMLHttpRequest, textStatus, errorThrown) { 
      alert('error');    
     } 

    }); 

编辑: 当我运行上面的代码我得到错误处理程序得到执行。我试图安装Firebug,但我的FF是版本8,它无法安装它。所以我不确定错误是什么或者怎么看这是什么。

我在做什么错?

+0

你需要告诉我们什么JSON.stringify(someModel)的值! –

+0

我会编辑,谢谢 – sarsnake

+0

你仍然可以调用服务器端的代码,所以你应该能够设置一个断点在保存方法,看看模型结合是正确的,对不对? –

回答

3

我解决了这个问题。 MyClass需要具有无参数构造函数才能使绑定正常工作。希望这可以帮助某人。

2

您可以使用以下方法达到此目的。

$.postifyData = function (value) { 
var result = {}; 

var buildResult = function (object, prefix) { 
    for (var key in object) { 

     var postKey = isFinite(key) 
      ? (prefix != "" ? prefix : "") + "[" + key + "]" 
      : (prefix != "" ? prefix + "." : "") + key; 

     switch (typeof (object[key])) { 
      case "number": case "string": case "boolean": 
       result[postKey] = object[key]; 
       break; 

      case "object": 
       if (object[key] != null) { 
        if (object[key].toUTCString) result[postKey] = object[key].toUTCString().replace("UTC", "GMT"); 
        else buildResult(object[key], postKey != "" ? postKey : key); 
       } 
     } 
    } 
}; 

buildResult(value, ""); 
return result; 
} 

然后,你可以通过模型。

var someModel = new Object(); 
     someModel.Prop1 = "Pp1"; 
     someModel.Prop2 = "PP2"; 
     someModel.ListofStuff = new Array(); 
     //Use for each loop to bind list like 
     for (var i = 0; i < 2; i++) { 
      var childObj = new Object(); 
      childObj.Id = "123" + i; 
      childObj.Name = "Pankaj" 
      someModel.ListofStuff.push(childObj); 
     } 
     $.ajax({ 
      type: "POST", 
      url: "/home/test", 
      data: $.postifyData(someModel), 
      cache: false, 
      dataType: "json", 

      success: function() { 

       alert('success!'); 
      }, 

      error: function (XMLHttpRequest, textStatus, errorThrown) { 
       alert('error'); 
      } 

     }); 

我已经检查过我自己,这工作正常。

相关问题