diff --git a/src/Swashbuckle.AspNetCore.SwaggerGen/SchemaGenerator/SchemaGenerator.cs b/src/Swashbuckle.AspNetCore.SwaggerGen/SchemaGenerator/SchemaGenerator.cs index 7d6c79ec1f..07c98bcac0 100644 --- a/src/Swashbuckle.AspNetCore.SwaggerGen/SchemaGenerator/SchemaGenerator.cs +++ b/src/Swashbuckle.AspNetCore.SwaggerGen/SchemaGenerator/SchemaGenerator.cs @@ -367,15 +367,13 @@ private OpenApiSchema CreateDictionarySchema(DataContract dataContract, SchemaRe AdditionalPropertiesAllowed = false }; } - else + + return new OpenApiSchema { - return new OpenApiSchema - { - Type = "object", - AdditionalPropertiesAllowed = true, - AdditionalProperties = GenerateSchema(dataContract.DictionaryValueType, schemaRepository) - }; - } + Type = "object", + AdditionalPropertiesAllowed = true, + AdditionalProperties = GenerateSchema(dataContract.DictionaryValueType, schemaRepository) + }; } private OpenApiSchema CreateObjectSchema(DataContract dataContract, SchemaRepository schemaRepository) diff --git a/src/Swashbuckle.AspNetCore.SwaggerGen/SwaggerGenerator/SwaggerGenerator.cs b/src/Swashbuckle.AspNetCore.SwaggerGen/SwaggerGenerator/SwaggerGenerator.cs index e18b0139d5..83a410b16b 100644 --- a/src/Swashbuckle.AspNetCore.SwaggerGen/SwaggerGenerator/SwaggerGenerator.cs +++ b/src/Swashbuckle.AspNetCore.SwaggerGen/SwaggerGenerator/SwaggerGenerator.cs @@ -602,10 +602,19 @@ private OpenApiParameter GenerateParameterWithoutFilter( In = location, Required = isRequired, Schema = schema, - Description = description + Description = description, + Style = GetParameterStyle(type, apiParameter.Source) }; } + private static ParameterStyle? GetParameterStyle(Type type, BindingSource source) + { + return source == BindingSource.Query && type.IsGenericType && + typeof(IEnumerable>).IsAssignableFrom(type) + ? ParameterStyle.DeepObject + : null; + } + private (OpenApiParameter, ParameterFilterContext) GenerateParameterAndContext( ApiParameterDescription apiParameter, SchemaRepository schemaRepository) diff --git a/test/Swashbuckle.AspNetCore.IntegrationTests/SwaggerVerifyIntegrationTest.SwaggerEndpoint_ReturnsValidSwaggerJson_DotNet6_startupType=Basic.Startup_swaggerRequestUri=v1.verified.txt b/test/Swashbuckle.AspNetCore.IntegrationTests/SwaggerVerifyIntegrationTest.SwaggerEndpoint_ReturnsValidSwaggerJson_DotNet6_startupType=Basic.Startup_swaggerRequestUri=v1.verified.txt index 7c458f91bb..9ba7fd7080 100644 --- a/test/Swashbuckle.AspNetCore.IntegrationTests/SwaggerVerifyIntegrationTest.SwaggerEndpoint_ReturnsValidSwaggerJson_DotNet6_startupType=Basic.Startup_swaggerRequestUri=v1.verified.txt +++ b/test/Swashbuckle.AspNetCore.IntegrationTests/SwaggerVerifyIntegrationTest.SwaggerEndpoint_ReturnsValidSwaggerJson_DotNet6_startupType=Basic.Startup_swaggerRequestUri=v1.verified.txt @@ -837,6 +837,18 @@ "type": "string" } } + }, + { + "name": "search", + "in": "query", + "required": true, + "style": "deepObject", + "schema": { + "type": "object", + "additionalProperties": { + "type": "string" + } + } } ], "responses": { diff --git a/test/Swashbuckle.AspNetCore.IntegrationTests/SwaggerVerifyIntegrationTest.SwaggerEndpoint_ReturnsValidSwaggerJson_startupType=Basic.Startup_swaggerRequestUri=v1.verified.txt b/test/Swashbuckle.AspNetCore.IntegrationTests/SwaggerVerifyIntegrationTest.SwaggerEndpoint_ReturnsValidSwaggerJson_startupType=Basic.Startup_swaggerRequestUri=v1.verified.txt index d2fe392477..d569ed88c2 100644 --- a/test/Swashbuckle.AspNetCore.IntegrationTests/SwaggerVerifyIntegrationTest.SwaggerEndpoint_ReturnsValidSwaggerJson_startupType=Basic.Startup_swaggerRequestUri=v1.verified.txt +++ b/test/Swashbuckle.AspNetCore.IntegrationTests/SwaggerVerifyIntegrationTest.SwaggerEndpoint_ReturnsValidSwaggerJson_startupType=Basic.Startup_swaggerRequestUri=v1.verified.txt @@ -837,6 +837,18 @@ "type": "string" } } + }, + { + "name": "search", + "in": "query", + "required": true, + "style": "deepObject", + "schema": { + "type": "object", + "additionalProperties": { + "type": "string" + } + } } ], "responses": { diff --git a/test/WebSites/Basic/Controllers/FromQueryParamsController.cs b/test/WebSites/Basic/Controllers/FromQueryParamsController.cs index 9a16f877db..666dc02b7f 100644 --- a/test/WebSites/Basic/Controllers/FromQueryParamsController.cs +++ b/test/WebSites/Basic/Controllers/FromQueryParamsController.cs @@ -15,7 +15,7 @@ public IActionResult ValidateAddress([FromQuery]Address address) } [HttpGet("zip-codes/validate")] - public IActionResult ValidateZipCodes([FromQuery]IEnumerable zipCodes) + public IActionResult ValidateZipCodes([FromQuery]IEnumerable zipCodes, [FromQuery(Name = "search")] [Required] Dictionary parameters) { return new NoContentResult(); }