如何发布对象列表?

时间:2016-03-09 00:40:50

标签: c# asp.net json

我正在制作我的第一个使用关系的简单项目,一个非常简单的清单应用程序。我正在尝试使用title保存ItemList,它包含一组项目(项目名称和项目数量),我正在使用不同的模型。当我尝试从我的表单发布时,我收到以下模型状态错误:

  

无法将当前JSON数组(例如[1,2,3])反序列化为类型   'BringIt.Models.Item',因为该类型需要一个JSON对象(例如   {“name”:“value”})正确反序列化。   要修复此错误   将JSON更改为JSON对象(例如{“name”:“value”})或更改   反序列化类型为数组或实现集合的类型   接口(例如ICollection,IList)就像List一样   从JSON数组反序列化。也可以添加JsonArrayAttribute   到类型强制它从JSON数组反序列化。 ↵Path   'item',第1行,第46位。“姓名

我尝试更改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; }
    }
}

我的虚拟机

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);
        }
    }
}

回购

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')。service('itemListService',ItemListService);

感谢您的帮助。我已经在这里工作了太多时间而且无法破解它。

1 个答案:

答案 0 :(得分:1)

从客户端,您将发送一条JSON消息,如:

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

其中item是JSON数组。

您的C#视图模型没有可枚举的item属性。反序列化器无法将项数组分配给不可枚举的属性。您收到的错误消息准确无误,但如果您不熟悉术语,则会有点混乱!

我可能会建议您从问题中删除一些数据库代码,因为这完全不同。