【发布时间】:2019-04-14 06:20:58
【问题描述】:
我正在尝试为我的模型中的 ObjectId 类型创建一个非常简单的模型绑定器,但目前似乎无法使其工作。
这是模型绑定器:
public class ObjectIdModelBinder : IModelBinder
{
public Task BindModelAsync(ModelBindingContext bindingContext)
{
var result = bindingContext.ValueProvider.GetValue(bindingContext.FieldName);
return Task.FromResult(new ObjectId(result.FirstValue));
}
}
这是我编写的 ModelBinderProvider:
public class ObjectIdModelBinderProvider : IModelBinderProvider
{
public IModelBinder GetBinder(ModelBinderProviderContext context)
{
if (context == null) throw new ArgumentNullException(nameof(context));
if (context.Metadata.ModelType == typeof(ObjectId))
{
return new BinderTypeModelBinder(typeof(ObjectIdModelBinder));
}
return null;
}
}
这是我尝试将 body 参数绑定到的类:
public class Player
{
[BsonId]
[ModelBinder(BinderType = typeof(ObjectIdModelBinder))]
public ObjectId Id { get; set; }
public Guid PlatformId { get; set; }
public string Name { get; set; }
public int Score { get; set; }
public int Level { get; set; }
}
这是动作方法:
[HttpPost("join")]
public async Task<SomeThing> Join(Player player)
{
return await _someService.DoSomethingOnthePlayer(player);
}
为了让这段代码工作,我的意思是为了让模型绑定器运行,我从 Controller 继承了控制器,并从 Player 参数中删除了 [FromBody] 属性。
当我运行它时,我可以进入模型绑定器的 BindModelAsync 方法,但是我似乎无法从发布数据中获取 Id 参数值。我可以看到 bindingContext.FieldName 是正确的;它设置为 Id 但 result.FirstValue 为空。
我已经离开 Asp.Net MVC 一段时间了,似乎很多事情都发生了变化,变得更加混乱 :-)
编辑 基于 cmets,我认为我应该提供更多上下文。
如果我将 [FromBody] 放在 Player 操作参数之前,player 将设置为 null。如果我删除 [FromBody],player 会设置为默认值,而不是我发布的值。帖子正文如下所示,只是一个简单的 JSON:
{
"Id": "507f1f77bcf86cd799439011"
"PlatformId": "9c8aae0f-6aad-45df-a5cf-4ca8f729b70f"
}
【问题讨论】:
-
你是说
var result = ..是null? -
不,不是结果。但 result.FirstValue 为空。还编辑了问题。
-
您确认
Request.Form(或Request.Body)确实包含id的值吗? -
你传递什么作为输入?您也可以发布您的测试输入吗?
标签: c# mongodb asp.net-core asp.net-core-mvc model-binding