как читать безымянный объект из BindingContext - PullRequest
0 голосов
/ 30 марта 2019

Мне нужно реализовать привязку пользовательской модели, поэтому я пытаюсь реализовать приложение IModelBinder для .Net Core 2.1 API.

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

В запросе почтальона, который я использую для тестирования, есть объект JSON в body, и простейшая форма выглядит следующим образом -

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

Обратите внимание, что этот запрос исходит от существующего устаревшего клиента, который я не могу контролировать, и объект JSON, который будет представлен как тело в POST, не будет иметь имени.

В QuickWatch в VisualStudio я также вижу, что bindingContext.ValueProvider.Count is 1 и bindingContext.ModelMetadata имеют Parameter из person и Type из Person и bindingContext.FieldName равно person. И на удивление bindingProvider.Result это Failed и bindingContext.ModelName всегда String.Empty

Может кто-нибудь, пожалуйста, помогите мне получить ModelName от BindingContext. И если в этой ситуации нет способа получить ModelName, то как я могу прочитать объект Person из BindingContext?

1 Ответ

0 голосов
/ 02 апреля 2019

Я нашел лучший способ прочитать опубликованные параметры, и так как я не получил никакого ответа на этот вопрос, я опубликую, как я это сделал, если это может быть полезно кому-либо еще

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