Я делаю свой первый простой проект, который использует отношения, довольно простое приложение контрольного списка. Я пытаюсь сохранить ItemList с заголовком, и он содержит коллекцию элементов (имя элемента и количество элементов), для которых я использую другую модель. Когда я пытаюсь опубликовать от моей формы, я получаю следующее сообщение об ошибке: ModelStateКак POST список объектов?
Cannot deserialize the current JSON array (e.g. [1,2,3]) into type 'BringIt.Models.Item' because the type requires a JSON object (e.g. {"name":"value"}) to deserialize correctly. To fix this error either change the JSON to a JSON object (e.g. {"name":"value"}) or change the deserialized type to an array or a type that implements a collection interface (e.g. ICollection, IList) like List that can be deserialized from a JSON array. JsonArrayAttribute can also be added to the type to force it to deserialize from a JSON array. ↵Path 'item', line 1, position 46." Name
Я попытался изменить типы в моей VM и моделях, но не могу пройти мимо этой ошибки. Вот мой существующий код:
Модели:
namespace BringIt.Models {
public class ItemList {
public int Id { get; set; }
public string Title { get; set; }
public DateTime EventDate { get; set; }
public ICollection<Item> Items { get; set; }
}
}
namespace BringIt.Models {
public class Item {
public int Id { get; set; }
public string ItemName { get; set; }
public int ItemQty { get; set; }
public string Person { get; set; }
public ItemList ItemList { get; set; }
}
}
My VM
namespace BringIt.ViewModels {
public class AddItemsVM {
public Item item { get; set; }
public ItemList itemList { get; set; }
}
}
стороне клиента Контроллер
export class CreateItemListController {
public itemList = null;
public item;
public items = [];
public addNew() {
var item = {};
this.items.push(item);
}
public save() {
this.itemListService.save(this.itemList, this.items).then(() => { this.$location.path('/') });
}
constructor(
private itemListService: MyApp.Services.ItemListService,
private $location: angular.ILocationService
) {
стороне сервера Контроллер
namespace BringIt.API
{
public class ItemListController : ApiController {
private IEFRepository _repo;
public ItemListController(IEFRepository repo) {
this._repo = repo;
}
public IHttpActionResult Post(AddItemsVM data) {
if (!ModelState.IsValid) {
return BadRequest(this.ModelState);
}
var itemList = data.itemList;
var item = data.item;
_repo.SaveItem(itemList, item);
return Created("", itemList);
}
}
}
Repo
public void SaveItem(ItemList listToSave, Item items) {
if (listToSave.Id == 0) {
listToSave.EventDate = DateTime.Now;
_db.ItemLists.Add(listToSave);
_db.Items.Add(items);
_db.SaveChanges();
} else {
var original = _db.ItemLists.Find(listToSave.Id);
original.Title = listToSave.Title;
original.EventDate = listToSave.EventDate;
original.Items = listToSave.Items;
_db.SaveChanges();
}
}
}
на стороне клиента службы пространств имен MyApp.Services {
export class ItemListService {
private ItemListResource;
public save(itemList, items) {
debugger;
var data: any = {}
data.itemList = itemList;
data.item = items;
return this.ItemListResource.save(data).$promise;
}
constructor($resource: angular.resource.IResourceService) {
this.ItemListResource = $resource('/api/itemList/:id');
}
}
angular.module ('MyApp'). Обслуживание ('itemListService', ItemListService);
Спасибо за помощь. Я занимаюсь этим слишком много часов и просто не могу взломать его.
Если вы знаете его проблему десериализации, вероятно, вы должны разместить html/javascript вместо репо. Ваше связующее устройство не может связываться должным образом, потому что для каждого свойства в элементе вам нужно соответствующее свойство в json, если его не задано –
, действие вашего контроллера не принимает никаких параметров, откуда вы получаете this.itemList и т. Д. Public save() { this.itemListService.save (this.itemList, this.items) .then (() => {this. $ Location.path ('/')}); } ' –
с использованием json-скрипта Jackson сделает вашу жизнь проще. Он построен для такого рода ситуаций. – Aizen