ASP.Net Core Swagger如何忽略默认参数值

时间:2019-05-13 19:04:27

标签: asp.net-core swagger swagger-ui swashbuckle

是否有一种方法可以“抑制” SwaggerUI为可选参数预选择默认值的方式?我们仍然希望这些参数包含在生成的文档中,只是没有选择任何值。这是它在SwaggerUI 2.x中的工作方式,但看起来3.x不再是这种情况

编辑-添加示例以阐明我的问题。

作为示例-假设您具有以下端点:

[HttpGet]
public dynamic GetSomething(
     string filter1, 
     string filter2, 
     bool shouldIFilter = false, 
     SomeEnum enumValue = SomeEnum.Whatever)

大张旗鼓,当您单击“试用”时, shouldIFilter enumValue 输入字段将具有已选择的方法签名中指定的默认值。 相反,我希望这些字段没有选择任何值,以便在单击“执行”时将它们包含在查询中。

基本上,请求网址应类似于:http://some.url.com/v3/search?filter1=afilter&filter2=anotherfilter

(不带&shouldIFilter = false&enumValue =任何值)

---编辑:05/20/2019 ---

根据下面的Helder的建议,我尝试注入js来解决这个问题。我发现的第一件事是,在单击“试用”按钮之前,输入字段不存在。并且,在列表中展开特定的“操作”之前,此按钮不存在!但是,当连接观察者以将元素添加到DOM时根据需要设置值之后,我就能够成功更改所选值。

但是,当您单击Execute时,这些值将刷新以符合原始规范-并且我的js不会再次触发以更改我希望它们成为的值。

我开始认为这可能是不可能的。尽管我认为我可能会尝试创建一个可能能够做到这一点的SwaggerUI插件-但我也不希望在那里有很多成功。

还有其他想法吗?

2 个答案:

答案 0 :(得分:0)

听起来像您一直在使用默认值来记录参数...
您应该为此使用说明字段,这是一个示例:

"parameters": [
    {
        "name": "x.lat",
        "in": "query",
        "description": "**Latitude**: a geographic coordinate that specifies the north–south position of a point on the Earth's surface.",
        "required": false,
        "type": "number",
        "format": "float",
        "maximum": 90,
        "minimum": -90
    },
    {
        "name": "x.lon",
        "in": "query",
        "description": "**Longitude**: a geographic coordinate that specifies the east-west position of a point on the Earth's surface.",
        "required": false,
        "type": "number",
        "format": "float",
        "maximum": 180,
        "minimum": -180
    }
],

swagger-ui中的内容如下:
http://swagger-net-test.azurewebsites.net/swagger/ui/index?filter=Location#/Location/Location_Get2

该模型的代码在这里:
https://github.com/heldersepu/Swagger-Net-Test/blob/master/Swagger_Test/Models/Location.cs


如果必须保留默认值,则必须inject JS禁用此功能,但是如果UI更改,则可能会中断

答案 1 :(得分:0)

要结束此循环,我想分享一下我最终为解决此问题所做的事情(尽管我们还没有决定是否要继续前进)。

由于使用React Swagger UI 3.x,试图注入JS太麻烦了-我能够为特定参数更改UI中的选定值,但是一旦单击“执行”,它们就会“重置”恢复为默认值。

相反,我最终添加了一个IParameterFilter来更改参数默认值,并确保另外正确记录了每个参数以显示默认值

public void Apply(OpenApiParameter parameter, ParameterFilterContext context)
{
   if (parameter.In != ParameterLocation.Query) return;

   // readonly list to limit which parameters have this applied
   if (_parametersToUnSet.Contains(parameter.Name))
   {
       parameter.Description = $"*Default value*: {parameter.Schema.Default}";
       parameter.Schema.Default = null;
   }
 }