Привязка к объекту из маршрута и строки запроса для метода GET - PullRequest
0 голосов
/ 22 мая 2019

Я играл с веб-API в 2.2 и у меня нет проблем с методами post с объектами или методами get с примитивами. Моя проблема в том, что я хотел бы связать объект модели из метода get из значения в маршруте и значения строки запроса одновременно.

Так что в основном из приведенного ниже кода я хотел бы привязать простой объект. Если вы представляете, что URL-адрес:

http://localhost:9999/api/Values/{Firstname}?{Surname}=Bob

Я попытался украсить объект модели и получил 415 ответов, которые казались странными

using Microsoft.AspNetCore.Mvc;

namespace apitest.Controllers
{
    [Route("api/[controller]")]
    [ApiController]
    public class ValuesController : ControllerBase
    {
        // GET api/values/5
        [HttpGet("{Firstname}")]
        public ActionResult<string> Get(Person person)
        {
            return "value";
        }
    }
}

namespace apitest
{
    public class Person
    {
        public string Firstname { get; set; }
        public string Surname { get; set; }
    }
}

Очевидно, что пример является тривиальным и бессмысленным, но в основном я просто хочу отобразить Имя и Фамилию из маршрута / строки запроса и свойств Имя / Фамилия объекта Person. Должен ли я написать пользовательские связующие модели? Если да, то есть какие-нибудь замечательные примеры?

1 Ответ

0 голосов
/ 23 мая 2019

По вашей причине, это вызвано SuppressInferBindingSourcesForParameters.

//
// Summary:
//     Options used to configure behavior for types annotated with Microsoft.AspNetCore.Mvc.ApiControllerAttribute.
public class ApiBehaviorOptions : IEnumerable<ICompatibilitySwitch>, IEnumerable
{
    //
    // Summary:
    //     Gets or sets a value that determines if model binding sources are inferred for
    //     action parameters on controllers annotated with Microsoft.AspNetCore.Mvc.ApiControllerAttribute
    //     is suppressed.
    //     When enabled, the following sources are inferred: Parameters that appear as route
    //     values, are assumed to be bound from the path (Microsoft.AspNetCore.Mvc.ModelBinding.BindingSource.Path).
    //     Parameters of type Microsoft.AspNetCore.Http.IFormFile and Microsoft.AspNetCore.Http.IFormFileCollection
    //     are assumed to be bound from form. Parameters that are complex (Microsoft.AspNetCore.Mvc.ModelBinding.ModelMetadata.IsComplexType)
    //     are assumed to be bound from the body (Microsoft.AspNetCore.Mvc.ModelBinding.BindingSource.Body).
    //     All other parameters are assumed to be bound from the query.
    public bool SuppressInferBindingSourcesForParameters { get; set; }

Настройте это значение в Startup.cs как

services.AddMvc().SetCompatibilityVersion(CompatibilityVersion.Version_2_2)
.ConfigureApiBehaviorOptions(options => {
    options.SuppressInferBindingSourcesForParameters = true;
});
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...