在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获取到,如下。
,
如果没有用匿名类,得到了的就是字符串的长度