Сериализация Camelcase свойств запроса «FromRoute» - PullRequest
0 голосов
/ 31 августа 2018

В моем приложении ASP.NET Core 2.1 MVC я хочу указать маршрут следующим образом:

/address/v1/postcode/{postcode}/street/{street}

Я определил свой контроллер следующим образом:

[Route("address/v1")]
[ApiController]
public class StreetController : ControllerBase
{
    [HttpGet("postcode/{postcode}/street/{street}")]
    public ActionResult<GetStreetDetailsResponse> GetStreetDetails([FromRoute] GetStreetDetailsRequest request)
    {
        throw new NotImplementedException();
    }
}

public class GetStreetDetailsRequest
{
    [Required]
    [StringLength(4, MinimumLength = 4)]
    [RegularExpression("^[\\d]+$")]
    public string Postcode { get; set; }

    [Required]
    public string Street { get; set; }
}

public class GetStreetDetailsResponse
{
}

Маршрут разрешается должным образом, однако среда не десериализует значения Postcode и Street, и эти свойства не заполняются правильно в GetStreetDetailsRequest.

Например, если я позвоню:

http://localhost/address/v1/postcode/0629/street/whatever

когда он попадает в метод действия, значение request.Postcode = "{postcode}" и request.Street = "{street}".

Проблема, по-видимому, связана с регистром имен моих свойств, потому что если я изменю GetStreetDetailsRequest на:

public class GetStreetDetailsRequest
{
    [Required]
    [StringLength(4, MinimumLength = 4)]
    [RegularExpression("^[\\d]+$")]
    public string postcode { get; set; }

    [Required]
    public string street { get; set; }
}

все работает правильно. Однако я не доволен этим решением, поскольку оно не соответствует общепринятым стандартам именования C #.

Я пытался украсить свойства с помощью [DataMember (Name = "postcode")] или [JsonProperty ("postcode")], но, похоже, они тоже игнорируются.

Для записи, в моем методе Startup.ConfigureServices () я использую сериализатор по умолчанию, который, как я понимаю, поддерживает случай верблюда:

services.AddMvc().SetCompatibilityVersion(CompatibilityVersion.Version_2_1);

У кого-нибудь есть решение, которое позволит мне выставлять маршрут со свойствами дела верблюда, используя регистр Pascal в именах свойств объекта запроса?

1 Ответ

0 голосов
/ 31 августа 2018

Ну, вы в некотором смысле правы. Это:

[HttpGet("postcode/{postcode}/street/{street}")]

Говорит, что у вас есть свойство postcode и street, а у вас нет ни одного из них. Если вы хотите, чтобы привязка по умолчанию работала, корпус должен точно соответствовать:

[HttpGet("postcode/{Postcode}/street/{Street}")]
...