在我的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
{
}
该路由能够按预期方式解析,但是,该框架未对邮政编码和Street值进行反序列化,并且这些属性未在GetStreetDetailsRequest中正确填充。
例如,如果我打电话:
http://localhost/address/v1/postcode/0629/street/whatever
当它进入action方法时,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 case公开带有驼峰案例属性的路由吗?
答案 0 :(得分:0)
嗯,您在某种程度上是正确的。这个:
[HttpGet("postcode/{postcode}/street/{street}")]
说您有一个postcode
和一个street
属性,而您却没有。如果要使默认绑定生效,则大小写必须完全匹配:
[HttpGet("postcode/{Postcode}/street/{Street}")]