记录一下自定义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获取到,如下。
,
如果没有用匿名类,得到了的就是字符串的长度
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 基于Microsoft.Extensions.AI核心库实现RAG应用
· Linux系列:如何用heaptrack跟踪.NET程序的非托管内存泄露
· 开发者必知的日志记录最佳实践
· SQL Server 2025 AI相关能力初探
· Linux系列:如何用 C#调用 C方法造成内存泄露
· Manus爆火,是硬核还是营销?
· 终于写完轮子一部分:tcp代理 了,记录一下
· 别再用vector<bool>了!Google高级工程师:这可能是STL最大的设计失误
· 单元测试从入门到精通
· 震惊!C++程序真的从main开始吗?99%的程序员都答错了