Отправка сложных объектов JSON в Asp.net MVC с помощью jQuery - PullRequest
3 голосов
/ 07 декабря 2010

Я определяю объект как:

data = {
    first: { Id: 1, Name: "This is my first name." },
    second: { Id: 2, Name: "The second one." }
};

Затем я пытаюсь выполнить запрос Ajax, используя:

$.ajax({
    url: "/SomeURL"
    type: "POST",
    data: data,
    success: function(){ ... },
    error: function(){ ... }
});

Но мои данные преобразуются в массив, похожий на структуру, которую механизм связывания по умолчанию для Asp.net MVC не может понять.

first[Id]=1&first[Name]=...

Что я должен установить или сделать, чтобы jQuery правильно конвертировал их в:

first.Id=1&first.Name=...

Ответы [ 4 ]

5 голосов
/ 07 декабря 2010

Вы пытались сгладить ваши данные?

data = {
    "first.Id": 1,
    "first.Name": "This is my first name.",
    "second.Id": 2,
    "second.Name": "The second one."
};

Вот небольшое расширение jQuery для выравнивания ваших данных:

jQuery.flatten = function(data) {
    var flattenFunc = function(flattenedData, flattenFunc, name, value) {
        if (typeof(value) == 'object') {
            for (var item in value) {
                flattenFunc(flattenedData, flattenFunc, name ? name + '.' + item : item, value[item]);
            }
        }
        else {
            flattenedData[name] = value;
        }
    };

    var flattenedData = new Array();
    flattenFunc(flattenedData, flattenFunc, null, data);
    return flattenedData;
};

Просто замените data на $.flatten(data) в вашем запросе Ajax.

2 голосов
/ 09 декабря 2010

Вы можете создать функцию, чтобы превратить N уровней json в 1 уровень json, например:

$.simplifyJson = function(startingJson) {
  var fn = function(startingJson, parentKey) {
    var result = {};
    for(key in startingJson) {
      var newKey = parentKey;
      if(newKey != "")
        newKey += ".";
      newKey += key;
      if(typeof(startingJson[key]) == "object") {
        var result2 = fn(startingJson[key], newKey);
        for(key2 in result2) {
          result[key2] = result2[key2];
        }
      }
      else {
        result[newKey] = startingJson[key];
      }
    }
    return result;
  };

  return fn(startingJson, "");
}

Итак, когда вы делаете это:

var startingJson = {
  a: "hola",
  b: {
    c: "chau",
    d: "chau2"
  }
};

var endingJson = $.simplifyJson(startingJson);

В endingJson вы получите это

{
  a: "hola",
  b.c: "chau",
  b.d: "chau2"
}

Вот пример: http://jsfiddle.net/bY9nD/2/

2 голосов
/ 07 декабря 2010
0 голосов
/ 16 июля 2013

JavaScript

       var access = {
            Id: 0,
            HotelId: dropdownlistAccess.value(),
            RoleId: dropdownlistRole.value(),
            User: {
                Email: email
            }
        };

        $.ajax({
            url: "Access/Add",
            cache: false,
            type: "POST",
            contentType: 'application/json',
            data: JSON.stringify(access),
            success: function () {
                refreshDataSource();
            }
        });

Работа для действия контроллера

    public ActionResult Add(AccessViewModel newAccessViewModel)
    {
      // Your code here...
    }

Поле AccessViewModel & UserViewModel

public partial class AccessViewModel
{
    [Required(ErrorMessage="Id is required")]
    public int Id { get; set; }

    [Required(ErrorMessage="UserId is required")]
    public int UserId { get; set; }

    [Required(ErrorMessage="HotelId is required")]
    public int HotelId { get; set; }

    [Required(ErrorMessage="RoleId is required")]
    public int RoleId { get; set; }

    public UserViewModel User { get; set; } 
}

public partial class UserViewModel
{
    [Required(ErrorMessage="Id is required")]
    public int Id { get; set; }

    [Required(ErrorMessage="Email is required")]
    [StringLength(50)]
    [DataType(DataType.EmailAddress)]
    public string Email { get; set; }    
}   
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...