将复杂对象从jQuery AJAX传递到ASP.NET MVC中的Action函数

4

我有如下定义的域模型:

    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
    }

我使用 jQuery Ajax 在我的 JS 代码中调用上述操作

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,无法安装它。所以我不确定是什么错误或如何查看它。

我做错了什么?


你需要告诉我们 JSON.stringify(someModel) 的值是什么! - Martin Booth
你仍然调用服务器端代码,所以应该能够在Save方法中设置断点,以查看模型绑定是否正确,对吧? - Tim Hobbs
我试过了,它从来没有到达那个断点,只是出现了错误。 - sarsnake
当完全删除listOfStuff时,一切都像魔术般地运行。 - sarsnake
2个回答

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

        });

我已经亲自检查过了,这个运行良好。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接