2016-03-09 4 views
4

Я делаю свой первый простой проект, который использует отношения, довольно простое приложение контрольного списка. Я пытаюсь сохранить 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);

Спасибо за помощь. Я занимаюсь этим слишком много часов и просто не могу взломать его.

+1

Если вы знаете его проблему десериализации, вероятно, вы должны разместить html/javascript вместо репо. Ваше связующее устройство не может связываться должным образом, потому что для каждого свойства в элементе вам нужно соответствующее свойство в json, если его не задано –

+1

, действие вашего контроллера не принимает никаких параметров, откуда вы получаете this.itemList и т. Д. Public save() { this.itemListService.save (this.itemList, this.items) .then (() => {this. $ Location.path ('/')}); } ' –

+0

с использованием json-скрипта Jackson сделает вашу жизнь проще. Он построен для такого рода ситуаций. – Aizen

ответ

1

От клиента вы будете посылать сообщение в формате JSON, как:

{ 
    "itemList": {}, 
    "item": [{blah}, {blah}... ] 
} 

где item является массив JSON.

Ваша модель просмотра C# не имеет перечислимого объекта item. Deserializer не может назначить массив элементов неперечислимому свойству. Сообщение об ошибке, которое вы получаете, является точным, но немного запутанным, если вы не привыкли к терминологии!

Я могу порекомендовать вам удалить часть кода БД из вопроса, потому что это совсем другое дело.

Смежные вопросы