// 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. using System; using System.Collections.Generic; using Microsoft.AspNet.Mvc.Core; using Microsoft.AspNet.WebUtilities; using Microsoft.Framework.DependencyInjection; namespace Microsoft.AspNet.Mvc { /// /// An that returns a Created (201) response with a Location header. /// public class CreatedAtActionResult : ObjectResult { /// /// Initializes a new instance of the with the values /// provided. /// /// The name of the action to use for generating the URL. /// The name of the controller to use for generating the URL. /// The route data to use for generating the URL. /// The value to format in the entity body. public CreatedAtActionResult(string actionName, string controllerName, object routeValues, object value) : base(value) { ActionName = actionName; ControllerName = controllerName; RouteValues = TypeHelper.ObjectToDictionary(routeValues); StatusCode = StatusCodes.Status201Created; } /// /// Gets or sets the used to generate URLs. /// public IUrlHelper UrlHelper { get; set; } /// /// Gets or sets the name of the action to use for generating the URL. /// public string ActionName { get; set; } /// /// Gets or sets the name of the controller to use for generating the URL. /// public string ControllerName { get; set; } /// /// Gets or sets the route data to use for generating the URL. /// public IDictionary RouteValues { get; set; } /// protected override void OnFormatting([NotNull] ActionContext context) { var request = context.HttpContext.Request; var urlHelper = UrlHelper ?? context.HttpContext.RequestServices.GetRequiredService(); var url = urlHelper.Action( ActionName, ControllerName, RouteValues, request.Scheme, request.Host.ToUriComponent()); if (string.IsNullOrEmpty(url)) { throw new InvalidOperationException(Resources.NoRoutesMatched); } context.HttpContext.Response.Headers.Set("Location", url); } } }