diff --git a/src/Microsoft.AspNetCore.Mvc.Core/ConflictObjectResult.cs b/src/Microsoft.AspNetCore.Mvc.Core/ConflictObjectResult.cs
new file mode 100644
index 0000000000..02a2ca85d0
--- /dev/null
+++ b/src/Microsoft.AspNetCore.Mvc.Core/ConflictObjectResult.cs
@@ -0,0 +1,40 @@
+// Copyright (c) .NET Foundation. All rights reserved.
+// Licensed under the Apache License, Version 2.0. See License.txt in the project root for license information.
+
+using System;
+using Microsoft.AspNetCore.Http;
+using Microsoft.AspNetCore.Mvc.ModelBinding;
+
+namespace Microsoft.AspNetCore.Mvc
+{
+ ///
+ /// A that when executed will produce a Conflict (409) response.
+ ///
+ public class ConflictObjectResult : ObjectResult
+ {
+ ///
+ /// Creates a new instance.
+ ///
+ /// Contains the errors to be returned to the client.
+ public ConflictObjectResult(object error)
+ : base(error)
+ {
+ StatusCode = StatusCodes.Status409Conflict;
+ }
+
+ ///
+ /// Creates a new instance.
+ ///
+ /// containing the validation errors.
+ public ConflictObjectResult(ModelStateDictionary modelState)
+ : base(new SerializableError(modelState))
+ {
+ if (modelState == null)
+ {
+ throw new ArgumentNullException(nameof(modelState));
+ }
+
+ StatusCode = StatusCodes.Status409Conflict;
+ }
+ }
+}
diff --git a/src/Microsoft.AspNetCore.Mvc.Core/ConflictResult.cs b/src/Microsoft.AspNetCore.Mvc.Core/ConflictResult.cs
new file mode 100644
index 0000000000..92eb10385a
--- /dev/null
+++ b/src/Microsoft.AspNetCore.Mvc.Core/ConflictResult.cs
@@ -0,0 +1,21 @@
+// Copyright (c) .NET Foundation. All rights reserved.
+// Licensed under the Apache License, Version 2.0. See License.txt in the project root for license information.
+
+using Microsoft.AspNetCore.Http;
+
+namespace Microsoft.AspNetCore.Mvc
+{
+ ///
+ /// A that when executed will produce a Conflict (409) response.
+ ///
+ public class ConflictResult : StatusCodeResult
+ {
+ ///
+ /// Creates a new instance.
+ ///
+ public ConflictResult()
+ : base(StatusCodes.Status409Conflict)
+ {
+ }
+ }
+}
diff --git a/src/Microsoft.AspNetCore.Mvc.Core/ControllerBase.cs b/src/Microsoft.AspNetCore.Mvc.Core/ControllerBase.cs
index faac451c28..38328689a7 100644
--- a/src/Microsoft.AspNetCore.Mvc.Core/ControllerBase.cs
+++ b/src/Microsoft.AspNetCore.Mvc.Core/ControllerBase.cs
@@ -1790,6 +1790,32 @@ namespace Microsoft.AspNetCore.Mvc
return new UnprocessableEntityObjectResult(modelState);
}
+ ///
+ /// Creates an that produces a response.
+ ///
+ /// The created for the response.
+ [NonAction]
+ public virtual ConflictResult Conflict()
+ => new ConflictResult();
+
+ ///
+ /// Creates an that produces a response.
+ ///
+ /// Contains errors to be returned to the client.
+ /// The created for the response.
+ [NonAction]
+ public virtual ConflictObjectResult Conflict(object error)
+ => new ConflictObjectResult(error);
+
+ ///
+ /// Creates an that produces a response.
+ ///
+ /// The model state dictionary containing errors to be returned to the client.
+ /// The created for the response.
+ [NonAction]
+ public virtual ConflictObjectResult Conflict(ModelStateDictionary modelState)
+ => new ConflictObjectResult(modelState);
+
///
/// Creates an that produces a response.
///
diff --git a/test/Microsoft.AspNetCore.Mvc.Core.Test/BadRequestObjectResultTests.cs b/test/Microsoft.AspNetCore.Mvc.Core.Test/BadRequestObjectResultTests.cs
index 453575e5bf..b7b9330231 100644
--- a/test/Microsoft.AspNetCore.Mvc.Core.Test/BadRequestObjectResultTests.cs
+++ b/test/Microsoft.AspNetCore.Mvc.Core.Test/BadRequestObjectResultTests.cs
@@ -14,23 +14,23 @@ namespace Microsoft.AspNetCore.Mvc
{
// Arrange & Act
var obj = new object();
- var badRequestObjecResult = new BadRequestObjectResult(obj);
+ var badRequestObjectResult = new BadRequestObjectResult(obj);
// Assert
- Assert.Equal(StatusCodes.Status400BadRequest, badRequestObjecResult.StatusCode);
- Assert.Equal(obj, badRequestObjecResult.Value);
+ Assert.Equal(StatusCodes.Status400BadRequest, badRequestObjectResult.StatusCode);
+ Assert.Equal(obj, badRequestObjectResult.Value);
}
[Fact]
public void BadRequestObjectResult_ModelState_SetsStatusCodeAndValue()
{
// Arrange & Act
- var badRequestObjecResult = new BadRequestObjectResult(new ModelStateDictionary());
+ var badRequestObjectResult = new BadRequestObjectResult(new ModelStateDictionary());
// Assert
- Assert.Equal(StatusCodes.Status400BadRequest, badRequestObjecResult.StatusCode);
- var errors = Assert.IsType(badRequestObjecResult.Value);
+ Assert.Equal(StatusCodes.Status400BadRequest, badRequestObjectResult.StatusCode);
+ var errors = Assert.IsType(badRequestObjectResult.Value);
Assert.Empty(errors);
}
}
-}
\ No newline at end of file
+}
diff --git a/test/Microsoft.AspNetCore.Mvc.Core.Test/ConflictObjectResultTest.cs b/test/Microsoft.AspNetCore.Mvc.Core.Test/ConflictObjectResultTest.cs
new file mode 100644
index 0000000000..6efabdbe34
--- /dev/null
+++ b/test/Microsoft.AspNetCore.Mvc.Core.Test/ConflictObjectResultTest.cs
@@ -0,0 +1,36 @@
+// Copyright (c) .NET Foundation. All rights reserved.
+// Licensed under the Apache License, Version 2.0. See License.txt in the project root for license information.
+
+using Microsoft.AspNetCore.Http;
+using Microsoft.AspNetCore.Mvc.ModelBinding;
+using Xunit;
+
+namespace Microsoft.AspNetCore.Mvc
+{
+ public class ConflictObjectResultTest
+ {
+ [Fact]
+ public void ConflictObjectResult_SetsStatusCodeAndValue()
+ {
+ // Arrange & Act
+ var obj = new object();
+ var conflictObjectResult = new ConflictObjectResult(obj);
+
+ // Assert
+ Assert.Equal(StatusCodes.Status409Conflict, conflictObjectResult.StatusCode);
+ Assert.Equal(obj, conflictObjectResult.Value);
+ }
+
+ [Fact]
+ public void ConflictObjectResult_ModelState_SetsStatusCodeAndValue()
+ {
+ // Arrange & Act
+ var conflictObjectResult = new ConflictObjectResult(new ModelStateDictionary());
+
+ // Assert
+ Assert.Equal(StatusCodes.Status409Conflict, conflictObjectResult.StatusCode);
+ var errors = Assert.IsType(conflictObjectResult.Value);
+ Assert.Empty(errors);
+ }
+ }
+}
diff --git a/test/Microsoft.AspNetCore.Mvc.Core.Test/ConflictResultTest.cs b/test/Microsoft.AspNetCore.Mvc.Core.Test/ConflictResultTest.cs
new file mode 100644
index 0000000000..16835c55ef
--- /dev/null
+++ b/test/Microsoft.AspNetCore.Mvc.Core.Test/ConflictResultTest.cs
@@ -0,0 +1,21 @@
+// Copyright (c) .NET Foundation. All rights reserved.
+// Licensed under the Apache License, Version 2.0. See License.txt in the project root for license information.
+
+using Microsoft.AspNetCore.Http;
+using Xunit;
+
+namespace Microsoft.AspNetCore.Mvc
+{
+ public class ConflictResultTest
+ {
+ [Fact]
+ public void ConflictResult_InitializesStatusCode()
+ {
+ // Arrange & act
+ var conflictResult = new ConflictResult();
+
+ // Assert
+ Assert.Equal(StatusCodes.Status409Conflict, conflictResult.StatusCode);
+ }
+ }
+}
diff --git a/test/Microsoft.AspNetCore.Mvc.Core.Test/ControllerBaseTest.cs b/test/Microsoft.AspNetCore.Mvc.Core.Test/ControllerBaseTest.cs
index 48afdc739f..19664bba03 100644
--- a/test/Microsoft.AspNetCore.Mvc.Core.Test/ControllerBaseTest.cs
+++ b/test/Microsoft.AspNetCore.Mvc.Core.Test/ControllerBaseTest.cs
@@ -2066,6 +2066,53 @@ namespace Microsoft.AspNetCore.Mvc.Core.Test
Assert.Empty(errors);
}
+ [Fact]
+ public void Conflict_SetsStatusCode()
+ {
+ // Arrange
+ var controller = new TestableController();
+ var obj = new object();
+
+ // Act
+ var result = controller.Conflict();
+
+ // Assert
+ Assert.IsType(result);
+ Assert.Equal(StatusCodes.Status409Conflict, result.StatusCode);
+ }
+
+ [Fact]
+ public void Conflict_SetsStatusCodeAndValue_Object()
+ {
+ // Arrange
+ var controller = new TestableController();
+ var obj = new object();
+
+ // Act
+ var result = controller.Conflict(obj);
+
+ // Assert
+ Assert.IsType(result);
+ Assert.Equal(StatusCodes.Status409Conflict, result.StatusCode);
+ Assert.Equal(obj, result.Value);
+ }
+
+ [Fact]
+ public void Conflict_SetsStatusCodeAndValue_ModelState()
+ {
+ // Arrange
+ var controller = new TestableController();
+
+ // Act
+ var result = controller.Conflict(new ModelStateDictionary());
+
+ // Assert
+ Assert.IsType(result);
+ Assert.Equal(StatusCodes.Status409Conflict, result.StatusCode);
+ var errors = Assert.IsType(result.Value);
+ Assert.Empty(errors);
+ }
+
[Theory]
[MemberData(nameof(PublicNormalMethodsFromControllerBase))]
public void NonActionAttribute_IsOnEveryPublicNormalMethodFromControllerBase(MethodInfo method)