zoukankan      html  css  js  c++  java
  • 记录一下自定义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获取到,如下。

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

  • 相关阅读:
    魔术方法___toString()
    魔术方法__set()
    魔术方法__get()
    php面向对象之final关键字用法及实例
    php面向对象之什么是抽象类?及抽象类的作用
    php面向对象之对象克隆方法
    php面向对象之对象比较用法详解
    php面向对象之instanceof关键字的用法
    php表单怎么提交到数据库?
    php表单的验证详解
  • 原文地址:https://www.cnblogs.com/fanlin92/p/12701843.html
Copyright © 2011-2022 走看看