使用Swashbuckle AspNetCore生成的UI文档未遵循JsonProperty值。

5
我创建了一个类,用于发送排序和分页信息以应用于我的大型集合。我有一个.NET Core Web API服务将接收请求并将我的对象作为输入FromQuery。我想遵守某些命名约定(即Microsoft Rest API Guidelines),例如参数名称$orderby$top$skip等,并使用JsonProperty注释类的属性。
然而,在生成的swagger文档中,它们只显示为属性名称本身,这在我的属性命名为Take但请求参数应该是$top的情况下可能会出现问题。我希望生成的文档与之匹配,以不会对API的使用者造成困惑。我阅读的所有内容似乎都表明这应该可以正常工作,但我不知道为什么我的不行。
以下是我的类,其中使用了Newtonsoft.Json.JsonPropertyAttribute进行注释:
[JsonObject]
public class QueryParams {

    [JsonProperty( "$orderBy" )]
    public string OrderBy { get; set; }

    [JsonProperty( "$skip" )]
    public int? Skip { get; set; }

    [JsonProperty( "$top" )]
    public int? Take { get; set; }

    [JsonProperty( "$maxpagesize" )]
    public int? MaxPageSize { get; set; }

    [JsonProperty( "$count" )]
    public bool? IncludeCount { get; set; }
}

例如,我的Web API动作方法将类似于这样

    [HttpGet( "type/{type}" )]
    public async Task<IActionResult> GetByType( 
        string type, 
        [FromQuery]QueryParams parameters ) 
    {
       /* ... */ 

    }

我已经尝试了几种方法,比如尝试使用在为特定类型覆盖模式中提到的MapType,但是一直没有成功。非常感谢任何人能够提供关于此事的见解。

1个回答

6
根据这个GitHub问题,对于GET请求,JsonSerializer不用于绑定类。您需要自定义模型绑定。

因此,当您使用类表示查询参数时,将不涉及JsonSerializer。相反,MVC模型绑定用于直接将请求中的值分配到实例属性中。

因此,如果要明确指定此行为所需的大小写规则以及生成的说明,则还需要自定义模型绑定行为。我现在没有在我的笔记本电脑上,但是从我头脑中想到,我认为您可以使用“FromQuery”注释属性,并以此设置绑定名称。

如果我正确理解GH问题中的讨论,则以下内容应该有效:

public class QueryParams {

    [FromQuery( Name = "$orderBy" )]
    public string OrderBy { get; set; }

    [FromQuery( Name = "$skip" )]
    public int? Skip { get; set; }

    [FromQuery( Name = "$top" )]
    public int? Take { get; set; }

    [FromQuery( Name = "$maxpagesize" )]
    public int? MaxPageSize { get; set; }

    [FromQuery( Name = "$count" )]
    public bool? IncludeCount { get; set; }
}

1
谢谢@Stijn,使用FromQuery确实有效,并使用实际的“Name”。谢谢。 - Scott
.NET框架中是否有类似的属性?我没有使用.NET Core。 - Manvinder Singh

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接