如何从 BindingContext 读取未命名对象

how to read un-named object from BindingContext

我需要实现自定义模型绑定,因此尝试为 .Net Core 2.1 API 应用程序实现 IModelBinder

Model class -

  [ModelBinder(BinderType = typeof(PersonBinder))]
  public class Person
  {
     public name {get;set;}
     public address {get;set;}
  }

API 方法 -

 [HttpPost]
 [Route("process")]
 public async Task<ActionResult<int>> ProcessAsync([ModelBinder(typeof(PersonBinder))]Person person)
 {
     ...
 }

绑定模型方法 -

public Task BindModelAsync(ModelBindingContext bindingContext)
{
    var modelName = bindingContext.ModelName; //modelName is empty string
    ...
}

我用于测试的 Postman 请求在 body 中有 JSON 对象,最简单的形式如下所示 -

{
    "name": "name1"
    "address": "address1" 
}

请注意,此请求来自我无法控制的现有旧版客户端,JSON 对象将作为主体出现在 POST 中,将没有名称。

QuickWatchVisualStudio 我也看到 bindingContext.ValueProvider.Count is 1bindingContext.ModelMetadataParameter of personType PersonbindingContext.FieldNameperson。令人惊讶的是 bindingProvider.ResultFailedbindingContext.ModelName 总是 String.Empty

谁能帮我从 BindingContext 得到 ModelName。如果在这种情况下无法获得 ModelName 那么我如何从 BindingContext 中读取 Person 对象?

我找到了阅读 posted 参数的最佳方法,由于我没有得到对这个问题的任何答复,我将 post 我是如何做到的,如果它有帮助的话给其他人

        public Task BindModelAsync(ModelBindingContext bindingContext)
        {
            var request = bindingContext.HttpContext.Request;

            using (var reader = new StreamReader(request.Body, Encoding.UTF8))
            {
                var bodyString = reader.ReadToEnd();
                var person = bodyString.DeSerialize<Person>(); //this is custom logic to de-serialize to object from JSON string

                //write your model binding logic here...

                bindingContext.Result = ModelBindingResult.Success(person);
            }

            return Task.CompletedTask;
        }