diff --git a/samples/MvcSample.Web/HomeController.cs b/samples/MvcSample.Web/HomeController.cs
index 1d60a6d04f..91768f995f 100644
--- a/samples/MvcSample.Web/HomeController.cs
+++ b/samples/MvcSample.Web/HomeController.cs
@@ -29,6 +29,11 @@ namespace MvcSample.Web
return View();
}
+ public ActionResult NotFound()
+ {
+ return HttpNotFound();
+ }
+
///
/// Action that shows metadata when model is null.
///
diff --git a/src/Microsoft.AspNet.Mvc.Core/ActionResults/HttpNotFoundResult.cs b/src/Microsoft.AspNet.Mvc.Core/ActionResults/HttpNotFoundResult.cs
new file mode 100644
index 0000000000..350472853a
--- /dev/null
+++ b/src/Microsoft.AspNet.Mvc.Core/ActionResults/HttpNotFoundResult.cs
@@ -0,0 +1,19 @@
+// Copyright (c) Microsoft Open Technologies, Inc. All rights reserved.
+// Licensed under the Apache License, Version 2.0. See License.txt in the project root for license information.
+
+namespace Microsoft.AspNet.Mvc
+{
+ ///
+ /// Represents an that when
+ /// executed will produce a Not Found (404) response.
+ ///
+ public class HttpNotFoundResult : HttpStatusCodeResult
+ {
+ ///
+ /// Creates a new instance.
+ ///
+ public HttpNotFoundResult() : base(404)
+ {
+ }
+ }
+}
\ No newline at end of file
diff --git a/src/Microsoft.AspNet.Mvc.Core/ActionResults/HttpStatusCodeResult.cs b/src/Microsoft.AspNet.Mvc.Core/ActionResults/HttpStatusCodeResult.cs
index 39c01ae27f..eb14b754b6 100644
--- a/src/Microsoft.AspNet.Mvc.Core/ActionResults/HttpStatusCodeResult.cs
+++ b/src/Microsoft.AspNet.Mvc.Core/ActionResults/HttpStatusCodeResult.cs
@@ -2,21 +2,35 @@
// Licensed under the Apache License, Version 2.0. See License.txt in the project root for license information.
using System.Threading.Tasks;
+using Microsoft.AspNet.Http;
namespace Microsoft.AspNet.Mvc
{
+ ///
+ /// Represents an that when executed will
+ /// produce an HTTP response with the given response status code.
+ ///
public class HttpStatusCodeResult : ActionResult
{
- private int _statusCode;
-
+ ///
+ /// Initializes a new instance of the class
+ /// with the given .
+ ///
+ /// The HTTP status code of the response.
public HttpStatusCodeResult(int statusCode)
{
- _statusCode = statusCode;
+ StatusCode = statusCode;
}
+ ///
+ /// Gets the HTTP status code.
+ ///
+ public int StatusCode { get; private set; }
+
+ ///
public override void ExecuteResult([NotNull] ActionContext context)
{
- context.HttpContext.Response.StatusCode = _statusCode;
+ context.HttpContext.Response.StatusCode = StatusCode;
}
}
}
diff --git a/src/Microsoft.AspNet.Mvc.Core/Controller.cs b/src/Microsoft.AspNet.Mvc.Core/Controller.cs
index 1c80049c47..700784dfc5 100644
--- a/src/Microsoft.AspNet.Mvc.Core/Controller.cs
+++ b/src/Microsoft.AspNet.Mvc.Core/Controller.cs
@@ -415,6 +415,16 @@ namespace Microsoft.AspNet.Mvc
return new RedirectToRouteResult(Url, routeName, routeValues, permanent: true);
}
+ ///
+ /// Creates an that produces a Not Found (404) response.
+ ///
+ /// The created for the response.
+ [NonAction]
+ public virtual HttpNotFoundResult HttpNotFound()
+ {
+ return new HttpNotFoundResult();
+ }
+
///
/// Called before the action method is invoked.
///
diff --git a/src/Microsoft.AspNet.Mvc.Core/Microsoft.AspNet.Mvc.Core.kproj b/src/Microsoft.AspNet.Mvc.Core/Microsoft.AspNet.Mvc.Core.kproj
index ee88bb41c8..4340aa8f21 100644
--- a/src/Microsoft.AspNet.Mvc.Core/Microsoft.AspNet.Mvc.Core.kproj
+++ b/src/Microsoft.AspNet.Mvc.Core/Microsoft.AspNet.Mvc.Core.kproj
@@ -29,6 +29,7 @@
+
diff --git a/test/Microsoft.AspNet.Mvc.Core.Test/ActionResults/HttpNotFoundResultTests.cs b/test/Microsoft.AspNet.Mvc.Core.Test/ActionResults/HttpNotFoundResultTests.cs
new file mode 100644
index 0000000000..ecf88e74d5
--- /dev/null
+++ b/test/Microsoft.AspNet.Mvc.Core.Test/ActionResults/HttpNotFoundResultTests.cs
@@ -0,0 +1,17 @@
+using Xunit;
+
+namespace Microsoft.AspNet.Mvc
+{
+ public class HttpNotFoundResultTests
+ {
+ [Fact]
+ public void HttpNotFoundResult_InitializesStatusCode()
+ {
+ // Arrange & act
+ var notFound = new HttpNotFoundResult();
+
+ // Assert
+ Assert.Equal(404, notFound.StatusCode);
+ }
+ }
+}
\ No newline at end of file
diff --git a/test/Microsoft.AspNet.Mvc.Core.Test/ActionResults/HttpStatusCodeResultTests.cs b/test/Microsoft.AspNet.Mvc.Core.Test/ActionResults/HttpStatusCodeResultTests.cs
new file mode 100644
index 0000000000..ed4c548b90
--- /dev/null
+++ b/test/Microsoft.AspNet.Mvc.Core.Test/ActionResults/HttpStatusCodeResultTests.cs
@@ -0,0 +1,30 @@
+using System.IO;
+using System.Threading.Tasks;
+using Microsoft.AspNet.PipelineCore;
+using Microsoft.AspNet.Routing;
+using Xunit;
+
+namespace Microsoft.AspNet.Mvc
+{
+ public class HttpStatusCodeResultTests
+ {
+ [Fact]
+ public void HttpStatusCodeResult_ExecuteResultSetsResponseStatusCode()
+ {
+ // Arrange
+ var result = new HttpStatusCodeResult(404);
+
+ var httpContext = new DefaultHttpContext();
+ var routeData = new RouteData();
+ var actionDescriptor = new ActionDescriptor();
+
+ var context = new ActionContext(httpContext, routeData, actionDescriptor);
+
+ // Act
+ result.ExecuteResult(context);
+
+ // Assert
+ Assert.Equal(404, httpContext.Response.StatusCode);
+ }
+ }
+}
\ No newline at end of file
diff --git a/test/Microsoft.AspNet.Mvc.Core.Test/ControllerTests.cs b/test/Microsoft.AspNet.Mvc.Core.Test/ControllerTests.cs
index bdf3bbb3c5..3d9b797d29 100644
--- a/test/Microsoft.AspNet.Mvc.Core.Test/ControllerTests.cs
+++ b/test/Microsoft.AspNet.Mvc.Core.Test/ControllerTests.cs
@@ -357,6 +357,20 @@ namespace Microsoft.AspNet.Mvc.Test
Assert.Equal(TypeHelper.ObjectToDictionary(routeValues), resultPermanent.RouteValues);
}
+ [Fact]
+ public void HttpNotFound_SetsStatusCode()
+ {
+ // Arrange
+ var controller = new Controller();
+
+ // Act
+ var result = controller.HttpNotFound();
+
+ // Assert
+ Assert.IsType(result);
+ Assert.Equal(404, result.StatusCode);
+ }
+
[Theory]
[MemberData("PublicNormalMethodsFromController")]
public void NonActionAttribute_IsOnEveryPublicNormalMethodFromController(MethodInfo method)
diff --git a/test/Microsoft.AspNet.Mvc.Core.Test/Microsoft.AspNet.Mvc.Core.Test.kproj b/test/Microsoft.AspNet.Mvc.Core.Test/Microsoft.AspNet.Mvc.Core.Test.kproj
index 557de45ae2..8b4ab08e7f 100644
--- a/test/Microsoft.AspNet.Mvc.Core.Test/Microsoft.AspNet.Mvc.Core.Test.kproj
+++ b/test/Microsoft.AspNet.Mvc.Core.Test/Microsoft.AspNet.Mvc.Core.Test.kproj
@@ -23,6 +23,8 @@
+
+