我正在使用 mongodb 及其 ObjectId,它类似于 Guid .NET 类型(它是一个结构)。我希望能够直接从 API 中的路径参数自动绑定 ObjectId。我的工作模型活页夹看起来像这样:
public class ObjectIdModelBinder : IModelBinder
{
public Task BindModelAsync(ModelBindingContext bindingContext)
{
var result = bindingContext.ValueProvider.GetValue(bindingContext.FieldName);
bindingContext.Result = ObjectId.TryParse(result.FirstValue, out var objectId)
? ModelBindingResult.Success(objectId)
: ModelBindingResult.Failed();
return Task.CompletedTask;
}
}
我可以这样使用它:
[HttpGet("{id}")]
public async Task<IActionResult> GetData([FromRoute, ModelBinder(typeof(ObjectIdModelBinder)] ObjectId id)
{
//do something
}
如何将它与模型绑定程序提供程序一起使用,以便我不必一直为每个端点指定绑定程序?值类型真的不支持吗?
我不知道为什么它之前不起作用,但这个活页夹提供程序最终起作用了:
public class ObjectIdModelBinderProvider : IModelBinderProvider
{
public IModelBinder? GetBinder(ModelBinderProviderContext context) => context.Metadata.ModelType == typeof(ObjectId)
? new ObjectIdModelBinder()
: null;
}
然后像这样注册:
services.AddControllers(options =>
{
options.ModelBinderProviders.Insert(0, new ObjectIdModelBinderProvider());
});