如何在控制器方法中自动将字符串绑定到ObjectId中

问题描述 投票:0回答:1

我正在使用 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
    }

如何将它与模型绑定程序提供程序一起使用,以便我不必一直为每个端点指定绑定程序?值类型真的不支持吗?

c# asp.net mongodb asp.net-core model-binding
1个回答
0
投票

我不知道为什么它之前不起作用,但这个活页夹提供程序最终起作用了:

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());
     });
© www.soinside.com 2019 - 2024. All rights reserved.