如何从 BindingContext 读取未命名的对象



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

Model类 -

  [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
    ...
}

我用于测试的邮递员请求在bodyJSON对象,最简单的形式如下所示 -

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

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

VisualStudio QuickWatch中,我还看到bindingContext.ValueProvider.Count is 1bindingContext.ModelMetadata Parameter personType PersonbindingContext.FieldName person。令人惊讶的是,bindingProvider.Result Failed bindingContext.ModelName总是String.Empty

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

我已经找到了阅读已发布参数的最佳方法,由于我没有得到对此问题的任何答复,我将发布我是如何做到的,如果它对其他人有帮助的话

        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;
        }

相关内容

  • 没有找到相关文章

最新更新