Передача сложных объектов в Action в asp.net MVC из jquery ajax - PullRequest
4 голосов
/ 18 ноября 2011

У меня определена следующая модель домена:

    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, используя jqueryajax

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, и он не смог установить его.Поэтому я не уверен, что это за ошибка или как понять, что это такое.

Что я делаю не так?

Ответы [ 2 ]

3 голосов
/ 18 ноября 2011

Я решил проблему. MyClass должен был иметь конструктор без параметров, чтобы привязка работала правильно. Надеюсь, это кому-нибудь поможет.

2 голосов
/ 01 мая 2014

Вы можете использовать следующий метод для этой цели.

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

        });

Я проверил ее самостоятельно, и это работаетхорошо.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...