• 记录一下自定义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获取到,如下。

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

  • 相关阅读:
    Vmware安装CentOs7.4
    记录一次简单的springboot发送邮件功能
    jenkins 脱机下 安装插件失败
    centos8系统下docker安装jenkins
    Flask快速入门(9) — 请求扩展
    Flask快速入门(8) — 闪现flash
    Flask快速入门(7) — session
    Flask快速入门(6) — 常见的请求与响应参数
    Flask快速入门(5) — 模板渲染
    Flask快速入门(4) — CBV写法与解析
  • 原文地址:https://www.cnblogs.com/fanlin92/p/12701843.html
Copyright © 2020-2023  润新知