// Copyright (c) Microsoft Corporation. All rights reserved. See License.txt in the project root for license information.
using System.Collections.Generic;
using System.Diagnostics.CodeAnalysis;
using System.Web.Http.Controllers;
namespace System.Web.Http.Routing
{
public class UrlHelper
{
private HttpControllerContext _controllerContext;
public UrlHelper(HttpControllerContext controllerContext)
{
if (controllerContext == null)
{
throw Error.ArgumentNull("controllerContext");
}
ControllerContext = controllerContext;
}
///
/// Gets the of the current .
/// The setter is not intended to be used other than for unit testing purpose.
///
public HttpControllerContext ControllerContext
{
get { return _controllerContext; }
set
{
if (value == null)
{
throw Error.ArgumentNull("value");
}
_controllerContext = value;
}
}
public string Route(string routeName, object routeValues)
{
return GetHttpRouteHelper(ControllerContext, routeName, routeValues);
}
public string Route(string routeName, IDictionary routeValues)
{
return GetHttpRouteHelper(ControllerContext, routeName, routeValues);
}
[SuppressMessage("Microsoft.Usage", "CA2234:PassSystemUriObjectsInsteadOfStrings", Justification = "It is safe to pass string here")]
public string Link(string routeName, object routeValues)
{
string link = Route(routeName, routeValues);
if (!String.IsNullOrEmpty(link))
{
link = new Uri(ControllerContext.Request.RequestUri, link).AbsoluteUri;
}
return link;
}
[SuppressMessage("Microsoft.Usage", "CA2234:PassSystemUriObjectsInsteadOfStrings", Justification = "It is safe to pass string here")]
public string Link(string routeName, IDictionary routeValues)
{
string link = Route(routeName, routeValues);
if (!String.IsNullOrEmpty(link))
{
link = new Uri(ControllerContext.Request.RequestUri, link).AbsoluteUri;
}
return link;
}
private static string GetHttpRouteHelper(HttpControllerContext controllerContext, string routeName, object routeValues)
{
IDictionary routeValuesDictionary = HttpRouteCollection.GetTypeProperties(routeValues);
return GetHttpRouteHelper(controllerContext, routeName, routeValuesDictionary);
}
private static string GetHttpRouteHelper(HttpControllerContext controllerContext, string routeName, IDictionary routeValues)
{
if (routeValues == null)
{
// If no route values were passed in at all we have to create a new dictionary
// so that we can add the extra "httproute" key.
routeValues = new Dictionary();
routeValues.Add(HttpRoute.HttpRouteKey, true);
}
else
{
if (!routeValues.ContainsKey(HttpRoute.HttpRouteKey))
{
// Copy the dictionary so that we can add the extra "httproute" key used by all Web API routes to
// disambiguate them from other MVC routes.
routeValues = new Dictionary(routeValues);
routeValues.Add(HttpRoute.HttpRouteKey, true);
}
}
IHttpVirtualPathData vpd = controllerContext.Configuration.Routes.GetVirtualPath(
controllerContext: controllerContext,
name: routeName,
values: routeValues);
if (vpd == null)
{
return null;
}
return vpd.VirtualPath;
}
}
}