“ FromRoute”请求属性的驼峰式序列化

时间:2018-08-30 21:52:10

标签: c# asp.net-core asp.net-core-webapi asp.net-core-2.1

在我的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公开带有驼峰案例属性的路由吗?

1 个答案:

答案 0 :(得分:0)

嗯,您在某种程度上是正确的。这个:

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

说您有一个postcode和一个street属性,而您却没有。如果要使默认绑定生效,则大小写必须完全匹配:

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