diff --git a/src/Mvc/Mvc.Core/src/ControllerBase.cs b/src/Mvc/Mvc.Core/src/ControllerBase.cs index e502ca144a..dd83af24ad 100644 --- a/src/Mvc/Mvc.Core/src/ControllerBase.cs +++ b/src/Mvc/Mvc.Core/src/ControllerBase.cs @@ -1870,7 +1870,10 @@ namespace Microsoft.AspNetCore.Mvc detail: detail, instance: instance); - return new ObjectResult(problemDetails); + return new ObjectResult(problemDetails) + { + StatusCode = problemDetails.Status + }; } /// @@ -1946,7 +1949,10 @@ namespace Microsoft.AspNetCore.Mvc return new BadRequestObjectResult(validationProblem); } - return new ObjectResult(validationProblem); + return new ObjectResult(validationProblem) + { + StatusCode = validationProblem.Status + }; } /// diff --git a/src/Mvc/Mvc.Core/test/ControllerBaseTest.cs b/src/Mvc/Mvc.Core/test/ControllerBaseTest.cs index 8c3a4b17c6..74e99b5942 100644 --- a/src/Mvc/Mvc.Core/test/ControllerBaseTest.cs +++ b/src/Mvc/Mvc.Core/test/ControllerBaseTest.cs @@ -2316,6 +2316,7 @@ namespace Microsoft.AspNetCore.Mvc.Core.Test // Assert var badRequestResult = Assert.IsType(actionResult); var problemDetails = Assert.IsType(badRequestResult.Value); + Assert.Equal(400, badRequestResult.StatusCode); Assert.Equal(400, problemDetails.Status); Assert.Equal("One or more validation errors occurred.", problemDetails.Title); Assert.Equal("https://tools.ietf.org/html/rfc7231#section-6.5.1", problemDetails.Type); @@ -2348,6 +2349,48 @@ namespace Microsoft.AspNetCore.Mvc.Core.Test Assert.Equal(detail, problemDetails.Detail); } + [Fact] + public void ValidationProblemDetails_UsesSpecifiedStatusCode() + { + // Arrange + var options = GetApiBehaviorOptions(); + + var controller = new TestableController + { + ProblemDetailsFactory = new DefaultProblemDetailsFactory(Options.Create(options)), + }; + + // Act + var actionResult = controller.ValidationProblem(statusCode: 405); + + // Assert + var objectResult = Assert.IsType(actionResult); + var problemDetails = Assert.IsType(objectResult.Value); + Assert.Equal(405, objectResult.StatusCode); + Assert.Equal(405, problemDetails.Status); + } + + [Fact] + public void ValidationProblemDetails_StatusCode400_ReturnsBadRequestObjectResultFor2xCompatibility() + { + // Arrange + var options = GetApiBehaviorOptions(); + + var controller = new TestableController + { + ProblemDetailsFactory = new DefaultProblemDetailsFactory(Options.Create(options)), + }; + + // Act + var actionResult = controller.ValidationProblem(statusCode: 400); + + // Assert + var badRequestResult = Assert.IsType(actionResult); + var problemDetails = Assert.IsType(badRequestResult.Value); + Assert.Equal(400, badRequestResult.StatusCode); + Assert.Equal(400, problemDetails.Status); + } + [Fact] public void ProblemDetails_Works() { @@ -2371,6 +2414,7 @@ namespace Microsoft.AspNetCore.Mvc.Core.Test // Assert var badRequestResult = Assert.IsType(actionResult); var problemDetails = Assert.IsType(badRequestResult.Value); + Assert.Equal(500, actionResult.StatusCode); Assert.Equal(500, problemDetails.Status); Assert.Equal("An error occured while processing your request.", problemDetails.Title); Assert.Equal("https://tools.ietf.org/html/rfc7231#section-6.6.1", problemDetails.Type); @@ -2396,6 +2440,7 @@ namespace Microsoft.AspNetCore.Mvc.Core.Test // Assert var badRequestResult = Assert.IsType(actionResult); var problemDetails = Assert.IsType(badRequestResult.Value); + Assert.Equal(500, actionResult.StatusCode); Assert.Equal(500, problemDetails.Status); Assert.Equal(title, problemDetails.Title); Assert.Equal("https://tools.ietf.org/html/rfc7231#section-6.6.1", problemDetails.Type); @@ -2419,6 +2464,7 @@ namespace Microsoft.AspNetCore.Mvc.Core.Test // Assert var badRequestResult = Assert.IsType(actionResult); var problemDetails = Assert.IsType(badRequestResult.Value); + Assert.Equal(422, actionResult.StatusCode); Assert.Equal(422, problemDetails.Status); Assert.Equal("Unprocessable entity.", problemDetails.Title); Assert.Equal("https://tools.ietf.org/html/rfc4918#section-11.2", problemDetails.Type);