Я учусь использовать ASP.NET MVC с AngularJS.
Сначала мы можем взглянуть на мой код AngularJS, который выполняет запрос POST на сервере:
$http({
method: 'POST',
url: '/Test/PostForm',
dataType: "json",
headers: { 'Content-Type': 'application/x-www-form-urlencoded; charset=UTF-8;' },
data: $.param({
data: JSON.stringify($scope.productos),
}, true)
})
.success(function (data, status, headers, config) {
console.log(data);
})
.error(function (data, status, headers, config) {
console.log(data, status, headers, config);
})
Где:
$scope.productos = [ {desc:"Product 1", cant: 10, cu:100}, {desc:"Product 2", cant: 10, cu:100}...]
Я решил использовать метод JSON.stringify
в моем $scope.productos
чтобы передать его моим действиям, как показано ниже:
public JsonResult PostForm(string data)
{
System.Diagnostics.Debug.WriteLine(data);
Dictionary<string, string> values = JsonConvert.DeserializeObject<Dictionary<string, string>>(data); // Exception thrown here
System.Diagnostics.Debug.WriteLine("-------------------");
System.Diagnostics.Debug.WriteLine("-------------------");
string[] arr = { "Success", "Los archivos han sido agregados correctamente" };
return Json(arr, JsonRequestBehavior.DenyGet);
}
Моя проблема возникает при попытке выполнить Dictionary<string, string> values = JsonConvert.DeserializeObject<Dictionary<string, string>>(data);
поскольку я получаю исключение:
Невозможно десериализовать текущий массив JSON (например, [1,2,3]) в тип "System.Collections.Generic.Dictionary'2 [System.String, System.String]", поскольку для этого типа требуется объект JSON (например, {"name ":" value "}) для десериализации.
Чтобы исправить эту ошибку, измените JSON на объект JSON (например, {"name": "value"}) или измените десериализованный тип на массив или тип, реализующий интерфейс коллекции (например, ICollection, IList), например List, который может десериализоваться из массива JSON. JsonArrayAttribute также может быть добавлен к типу, чтобы заставить его десериализоваться из массива JSON.
Любая идея о том, как это исправить? Он должен получить правильную строку JSON, так как я не получаю никаких ошибок в JSON.stringify на моем.cshtml.
Я пытаюсь unpack
содержимое строки в массив или словарь.
Во-первых, вам нужно определить класс для десериализации строки JSON. Например:
public class Producto
{
[JsonProperty("desc")]
public string Descripcion{get;set;}
[JsonProperty("cant")]
public int Cantidad{get;set;}
[JsonProperty("cu")]
public int CostoPorUnidad{get;set;}
}
Затем вы можете десериализовать свою строку data
в массив Producto
:
var productos = JsonConvert.DeserializeObject<Producto[]>(data);
Или в словарь, используя некоторые LINQ:
var productos = JsonConvert.DeserializeObject<Producto[]>(data).ToDictionary(p=>p.Descripcion);
JsonConvert
документацию поJsonConvert
чтобы лучше понять ее, но вы, несомненно, дали мне хорошую отправную точку. Большое спасибо @Diego