• 记录一下自定义Model绑定器


    在WebApi中,当我们添加一个IEnumerable集合数据之后,我们想要把添加成功的数据返回,可以通过返回一个获取的路由得到新添加的数据。通常是传入一个IEnumerable类型的参数,通过主键集合来获取数据。这里要讲的是自定义模型绑定器,那么如何创建一个模型绑定器呢?直接上代码,这个是跟到老师敲的,还要多理解理解。

    public class ArrayModelBinder : IModelBinder
    {
    public Task BindModelAsync(ModelBindingContext bindingContext)
    {
    //如果作用的类型不是集合类型 返回失败
    if (!bindingContext.ModelMetadata.IsEnumerableType)
    {
    bindingContext.Result = ModelBindingResult.Failed();
    return Task.CompletedTask;
    }

    string value = bindingContext.ValueProvider.GetValue(bindingContext.ModelName).ToString();
    if (!string.IsNullOrEmpty(value))
    {
    bindingContext.Result = ModelBindingResult.Success(null);
    return Task.CompletedTask;
    }

    var elementType = bindingContext.ModelType.GetTypeInfo().GenericTypeArguments[0];
    //转换器
    var converter = TypeDescriptor.GetConverter(elementType);
    //分割字段 转换成 数组
    var values = value.Split(new[] {','}, StringSplitOptions.RemoveEmptyEntries)
    .Select(x => converter.ConvertFrom(x.Trim())).ToArray();
    //创建一个数组,具有elementType类型,长度为传入的数组的长度
    var typeValues = Array.CreateInstance(elementType, values.Length);
    //从0开始复制
    values.CopyTo(typeValues,0);
    //绑定typeValues为model
    bindingContext.Model = typeValues;
    //成功绑定
    bindingContext.Result=ModelBindingResult.Success(bindingContext.Model);
    return Task.CompletedTask;
    }
    }

    创建好之后,在根据ID集合获取数据的地方添加一个特性标记一下。

     就像这里,需要 [ModelBinder(BinderType = typeof(ArrayModelBinder))]来标记。

    在这里获取玩数据之后,就需要去添加数据的方法里面返回了。

     就这样,既可以在添加数据之后获取新添加的数据了。

    但是我又一个疑问,CreatedAtRoute的第二个参数,为什么要new 建立一个匿名类呢?貌似我用第一个,没有创建匿名类也没有问题,如果有懂得,麻烦告知,谢谢!

    -----------------------------------------------------------------分割线-----------------------------------------------------

    原因找到了

    只有使用匿名类,返回的路由中才会将新添加得到的ID获取到,如下。

    如果没有用匿名类,得到了的就是字符串的长度

  • 相关阅读:
    Java内存模型
    Thread.sleep(0)的作用
    Java中用到的线程调度算法是什么
    怎么检测一个线程是否持有对象监视器
    为什么要使用线程池
    ThreadLocal
    生产者消费者模型的作用
    线程间通信
    线程安全
    c#常日期转换(转)
  • 原文地址:https://www.cnblogs.com/fanlin92/p/12701843.html
Copyright © 2020-2023  润新知