将嵌套集合发布到Web API [英] Posting Nested Collection to Web API

查看:107
本文介绍了将嵌套集合发布到Web API的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!

问题描述

我正在尝试将复杂类型的对象发布到Web API.在网络api端,当方法接收到对象参数时,除从ICollection派生的集合外,每个属性均已正确设置.

I'm trying to post a complex type object to web api. On the web api side, when method recieves the object parameter, every property is set properly except a collection that is derived from ICollection.

这是我的示例课程:

public class MyClass
{
    private int id;

    public int Id
    {
        get { return id; }
        set { id = value; }
    }

    private MyCollection<string> collection;

    public MyCollection<string> Collection
    {
        get { return collection; }
        set { collection = value; }
    }
}

public class MyCollection<T> : ICollection<T>
{
    public System.Collections.Generic.List<T> list;

    public MyCollection()
    {
        list = new List<T>();
    }

    public void Add(T item)
    {
        list.Add(item);
    }

    public void Clear()
    {
        list.Clear();
    }

    public bool Contains(T item)
    {
        return list.Contains(item);
    }

    public void CopyTo(T[] array, int arrayIndex)
    {
        list.CopyTo(array, arrayIndex);
    }

    public int Count
    {
        get { return list.Count; }
    }

    public bool IsReadOnly
    {
        get { return false; }
    }

    public bool Remove(T item)
    {
        list.Remove(item);
        return true;
    }

    public IEnumerator<T> GetEnumerator()
    {
        return list.GetEnumerator();
    }

    System.Collections.IEnumerator System.Collections.IEnumerable.GetEnumerator()
    {
        return list.GetEnumerator();
    }
}

这是我的api控制器:

Here is my api controller:

public class ValuesController : ApiController
{
    // GET api/values
    public IEnumerable<string> Get()
    {
        return new string[] { "value1", "value2" };
    }

    // GET api/values/5
    public string Get(int id)
    {
        return "value";
    }

    // POST api/values
    public string Post([FromBody]MyClass value)
    {
        return "The object has " + value.Collection.Count + " collection item(s).";
    }

    // PUT api/values/5
    public void Put(int id, [FromBody]string value)
    {
    }

    // DELETE api/values/5
    public void Delete(int id)
    {
    }
}

这是我在客户端的测试方法:

Here is my test method on client side:

        function Test() {
        var obj = {
            'Id': '15',
            'Collection': [{
                '': 'item1'
            }, {
                '': 'item2'
            }]
        };
        $.post(serviceUrl, obj)
        .done(function (data) {
            alert(data);
        });

在Web Api上发布方法ID变为15,但Collection的长度为0.

On Web Api post method Id becomes 15 but Collection's length is 0.

但是当我将集合类型从MyCollection更改为ICollection时.集合的长度为2.

But when I change collection type to ICollection from MyCollection. Collection's length is 2.

为什么使用MyCollection时会出现零长度集合?实施错误吗?我该如何运作?

Why am I getting zero-length collection when I use MyCollection? Is it implemented wrong? How can I make it work?

推荐答案

我认为您需要创建一个这样的模型装订器:

I think you need to create a model binder like this:

Post([ModelBinder(typeof(MyClassModelBinder))] MyClass myClass)

如何执行此操作,请阅读以下文章: 参数绑定在ASPNET Web API

How to do it please read the following article: parameter binding in aspnet web api

这篇关于将嵌套集合发布到Web API的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!

查看全文
登录 关闭
扫码关注1秒登录
发送“验证码”获取 | 15天全站免登陆