// 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 System.Collections.Generic; using Microsoft.AspNet.Http; using Microsoft.AspNet.Mvc.Actions; using Microsoft.AspNet.Mvc.Core; using Microsoft.AspNet.Mvc.Routing; using Microsoft.Framework.DependencyInjection; using Microsoft.Framework.Internal; using Microsoft.Net.Http.Headers; namespace Microsoft.AspNet.Mvc { /// /// An that returns a Created (201) response with a Location header. /// public class CreatedAtRouteResult : ObjectResult { /// /// Initializes a new instance of the class with the values /// provided. /// /// The route data to use for generating the URL. /// The value to format in the entity body. public CreatedAtRouteResult(object routeValues, object value) : this(routeName: null, routeValues: routeValues, value: value) { } /// /// Initializes a new instance of the class with the values /// provided. /// /// The name of the route to use for generating the URL. /// The route data to use for generating the URL. /// The value to format in the entity body. public CreatedAtRouteResult( string routeName, object routeValues, object value) : base(value) { RouteName = routeName; RouteValues = PropertyHelper.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 route to use for generating the URL. /// public string RouteName { 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 urlHelper = UrlHelper ?? context.HttpContext.RequestServices.GetRequiredService(); var url = urlHelper.Link(RouteName, RouteValues); if (string.IsNullOrEmpty(url)) { throw new InvalidOperationException(Resources.NoRoutesMatched); } context.HttpContext.Response.Headers[HeaderNames.Location] = url; } } }