P24 自定义Model绑定器
一组资源,需要一组key
创建新的Action。参数从路由里面获得
P24 自定义Model绑定器
.net core允许我们使用自定义的Model绑定。下面就来创建一个自定义的Model绑定器。创建Helpers文件夹。
P24 自定义Model绑定器
创建类
P24 自定义Model绑定器
它需要实现IModelBinder接口,然后重写方法。ModelBindingContext里面有一些元数据
P24 自定义Model绑定器
首先我们的参数是IEnumerable类型的,所以我们要保证ModelBindingContext作用域IEnumerable类型
判断if如果不是作用域Enumerable类型那么就返回失败。
P24 自定义Model绑定器

获取的value是个字符串,如果字符串为空的 也表示传递是成功的 返回success
P24 自定义Model绑定器

注意最下面的: bindingContext.Model = typedValues;//设置最终的返回结果
P24 自定义Model绑定器
最终返回类型
P24 自定义Model绑定器
最终再返回Task.CpmpletedTask
P24 自定义Model绑定器
value关键字有问题是因为上面有的没有返回值。
P24 自定义Model绑定器
把返回值加上就可以了
P24 自定义Model绑定器

P24 自定义Model绑定器

处理Post的Action的返回

应该返回的状态是201使用CreateAtRoute
给这个action增加Name值。
P24 自定义Model绑定器

运行测试

http://localhost:5000/api/companyCollections

[
    {
        "Name":"Facebook",
        "Introduction":"A Good Company"
    },
    {
        "Name":"Twitter",
        "Introduction":"A Good Company,too"
    },
    {
        "Name":"SpaceX",
        "Introduction":"A Good Company,Again"
    }
]

 

 

P24 自定义Model绑定器

返回的状态码是201.

P24 自定义Model绑定器
把Location的值复制出来:

http://localhost:5000/api/CompanyCollections/69a5fe4e-e5ca-4256-af58-8b1001c1432b,db773bfc-7d13-45ae-8170-c3dc9427c772,8b263ab0-194c-4778-a072-539e1937ea57
P24 自定义Model绑定器
获得了这三个公司信息
P24 自定义Model绑定器

在这里加上小括号
P24 自定义Model绑定器
这样在请求的时候就可以加上小括号了
P24 自定义Model绑定器

这样就很明显的可以看到id的组合用括号括起来
P24 自定义Model绑定器

另外这种key value的形式就也可以自定义ModelBinder的形式去写了。
P24 自定义Model绑定器

modelBinding 断点跟踪

 

P24 自定义Model绑定器

 

P24 自定义Model绑定器

P24 自定义Model绑定器

 

P24 自定义Model绑定器

 代码

 

using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Linq;
using System.Reflection;
using System.Threading.Tasks;
using Microsoft.AspNetCore.Mvc.ModelBinding;

namespace Routine.Api.Helpers
{
    public class ArrayModelBinder : IModelBinder
    {
        public Task BindModelAsync(ModelBindingContext bindingContext)
        {
            if (!bindingContext.ModelMetadata.IsEnumerableType) {
                //如果传入的类型不是Enumerable类型的 ,那么就返回失败的消息。
                bindingContext.Result = ModelBindingResult.Failed();
                return Task.CompletedTask;//
            }
            var value = bindingContext.ValueProvider.GetValue(bindingContext.ModelName).ToString();//获取到的就是逗号分隔开的字符串
            if (string.IsNullOrWhiteSpace(value)) {
                bindingContext.Result = ModelBindingResult.Success(null);
                return Task.CompletedTask;//
            }
            var elementType = bindingContext.ModelType.GetTypeInfo().GenericTypeArguments[0];
            var converter = TypeDescriptor.GetConverter(elementType);//转换器为了转换字符串为Guid类型

            var values = value.Split(new[] { "," }, StringSplitOptions.RemoveEmptyEntries)
                .Select(x => converter.ConvertFromString(x.Trim())).ToArray();
            var typedValues = Array.CreateInstance(elementType, values.Length);
            values.CopyTo(typedValues, 0);//values 复制到TypeValues 从第0个开始拷贝
            bindingContext.Model = typedValues;//设置最终的返回结果
            bindingContext.Result = ModelBindingResult.Success(bindingContext.Model);

            return Task.CompletedTask;
        }
    }
}
ArrayModelBinder

相关文章: