Post Array как контроллер JSON для MVC
Я пытаюсь найти решение этой проблемы.
В моем коде я создаю массив объекта;
var $marks = [];
var mark = function ( x, y, counter ){
this.x = x;
this.y = y;
this.counter = counter;
}
$marks.push(new mark(1, 2, 0));
$marks.push(new mark(1, 2, 1));
$marks.push(new mark(1, 2, 2));
Теперь я хочу опубликовать эти данные в MVC-контроллере, поэтому я думаю, что тип данных в контроллере будет List<Mark> Marks
или массив Marks.
Чтобы опубликовать данные, я пробовал:
var json = JSON.stringify($marks);
$.post('url', json).done(function(data){ /* handle */ });
ИЛИ
var json = { Marks: $marks };
$.post('url', json).done(function(data){ /* handle */ });
Второй способ, если смотреть на данные, выглядит так:
Marks[0][x]: 1
Marks[0][y]: 2
Marks[0][counter]: 0
Marks[0][x]: 1
Marks[0][y]: 2
Marks[0][counter]: 1
Marks[0][x]: 1
Marks[0][y]: 2
Marks[0][counter]: 2
Но я не уверен, как перевести это в строго типизированный объект в контроллер?
Мой контроллер выглядит следующим образом:
[HttpPost]
public ActionResult JsonSaveMarks(List<Mark> Marks){
// handle here
}
Класс My Mark выглядит следующим образом:
public class Mark{
public string x { get; set; }
public string y { get; set; }
public string counter { get; set; }
}
Я прочитал другие подобные проблемы о создании пользовательского JsonFilterAttribute или используя System.Web.Script.Serialization.JavaScriptSerializer, но я не могу заставить что-нибудь работать
Есть ли что-то очевидное, что я здесь отсутствует? Неужели я неправильно понял DataType в контроллере? Как преобразовать эти данные в строго типизированный объект?
Большое спасибо
Ответы
Ответ 1
$.post()
не позволяет вам установить тип содержимого вашего вызова AJAX - вы можете найти (если используете Fiddler), что ваша строка Json отправляется с типом контента "application/x-www- form-urlencoded" (настройка по умолчанию), которая затем приводит к тому, что Asp.Net MVC неправильно интерпретирует ваш пакет данных.
Можете ли вы попробовать использовать $.ajax()
вместо этого и установить тип содержимого в "application/json"?
http://api.jquery.com/jQuery.ajax/
Ответ 2
@SteveHobbs имеет правильный ответ здесь. С другой стороны, вы должны JSON.stringify
загружать JavaScript так же, как и вы. Если вы сделаете это по-другому, вы получите исключение, сообщив что-то вроде "Invalid JSON primitive" при десериализации входящих данных.
Вот полное решение для вашего образца:
$.ajax({
url: '/home/index',
type: 'POST',
data: JSON.stringify($marks),
dataType: 'json',
contentType: 'application/json',
success: function (data, textStatus, jqXHR) {
console.log(data);
}
});
Ответ 3
Этот код исправил мою проблему:
Классы С#:
public class MediaAccountContent
{
public Guid IdMedia { get; set; }
public string Value { get; set; }
}
public class User
{
public string Firstname { get; set; }
public string Lastname { get; set; }
public List<MediaAccountContent> MediaAccountContents { get; set; }
}
Действие MVC:
public ActionResult SavePlace(User user)
{
return Content("OK");
}
JavaScript:
var mediaAccountsJson = [];
for (var i = 0; i < 10; i++)
{
mediaAccountsJson.push({
IdMedia: i,
Value: "AAA" + i
});
}
var datatItem =
{
Firstname: "Test Firstname",
Lastname: "Test Lastname",
MediaAccountContents: mediaAccountsJson
};
$.ajax({
type: "POST",
contentType: 'application/json; charset=utf-8',
data: JSON.stringify(datatItem),
url: urlAction,
success: function (status) {
}
});
Внесите необходимые изменения в свой сценарий и наслаждайтесь!:)