You've already forked linux-packaging-mono
113 lines
4.1 KiB
C#
113 lines
4.1 KiB
C#
![]() |
// 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;
|
|||
|
}
|
|||
|
|
|||
|
/// <summary>
|
|||
|
/// Gets the <see cref="HttpControllerContext"/> of the current <see cref="ApiController"/>.
|
|||
|
/// The setter is not intended to be used other than for unit testing purpose.
|
|||
|
/// </summary>
|
|||
|
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<string, object> 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<string, object> 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<string, object> routeValuesDictionary = HttpRouteCollection.GetTypeProperties(routeValues);
|
|||
|
return GetHttpRouteHelper(controllerContext, routeName, routeValuesDictionary);
|
|||
|
}
|
|||
|
|
|||
|
private static string GetHttpRouteHelper(HttpControllerContext controllerContext, string routeName, IDictionary<string, object> 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<string, object>();
|
|||
|
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<string, object>(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;
|
|||
|
}
|
|||
|
}
|
|||
|
}
|