В моем приложении 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 в именах свойств объекта запроса?