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 @@ + +