Files
linux-packaging-mono/external/aspnetwebstack/src/System.Web.Mvc/UrlHelper.cs
Jo Shields a575963da9 Imported Upstream version 3.6.0
Former-commit-id: da6be194a6b1221998fc28233f2503bd61dd9d14
2014-08-13 10:39:27 +01:00

225 lines
11 KiB
C#

// Copyright (c) Microsoft Corporation. All rights reserved. See License.txt in the project root for license information.
using System.Diagnostics.CodeAnalysis;
using System.Globalization;
using System.Web.Mvc.Properties;
using System.Web.Routing;
using System.Web.WebPages;
namespace System.Web.Mvc
{
public class UrlHelper
{
public UrlHelper(RequestContext requestContext)
: this(requestContext, RouteTable.Routes)
{
}
public UrlHelper(RequestContext requestContext, RouteCollection routeCollection)
{
if (requestContext == null)
{
throw new ArgumentNullException("requestContext");
}
if (routeCollection == null)
{
throw new ArgumentNullException("routeCollection");
}
RequestContext = requestContext;
RouteCollection = routeCollection;
}
public RequestContext RequestContext { get; private set; }
public RouteCollection RouteCollection { get; private set; }
public string Action(string actionName)
{
return GenerateUrl(null /* routeName */, actionName, null, (RouteValueDictionary)null /* routeValues */);
}
public string Action(string actionName, object routeValues)
{
return GenerateUrl(null /* routeName */, actionName, null /* controllerName */, new RouteValueDictionary(routeValues));
}
public string Action(string actionName, RouteValueDictionary routeValues)
{
return GenerateUrl(null /* routeName */, actionName, null /* controllerName */, routeValues);
}
public string Action(string actionName, string controllerName)
{
return GenerateUrl(null /* routeName */, actionName, controllerName, (RouteValueDictionary)null /* routeValues */);
}
public string Action(string actionName, string controllerName, object routeValues)
{
return GenerateUrl(null /* routeName */, actionName, controllerName, new RouteValueDictionary(routeValues));
}
public string Action(string actionName, string controllerName, RouteValueDictionary routeValues)
{
return GenerateUrl(null /* routeName */, actionName, controllerName, routeValues);
}
public string Action(string actionName, string controllerName, object routeValues, string protocol)
{
return GenerateUrl(null /* routeName */, actionName, controllerName, protocol, null /* hostName */, null /* fragment */, new RouteValueDictionary(routeValues), RouteCollection, RequestContext, true /* includeImplicitMvcValues */);
}
public string Action(string actionName, string controllerName, RouteValueDictionary routeValues, string protocol, string hostName)
{
return GenerateUrl(null /* routeName */, actionName, controllerName, protocol, hostName, null /* fragment */, routeValues, RouteCollection, RequestContext, true /* includeImplicitMvcValues */);
}
public string Content(string contentPath)
{
return GenerateContentUrl(contentPath, RequestContext.HttpContext);
}
[SuppressMessage("Microsoft.Design", "CA1055:UriReturnValuesShouldNotBeStrings", Justification = "As the return value will used only for rendering, string return value is more appropriate.")]
public static string GenerateContentUrl(string contentPath, HttpContextBase httpContext)
{
if (String.IsNullOrEmpty(contentPath))
{
throw new ArgumentException(MvcResources.Common_NullOrEmpty, "contentPath");
}
if (httpContext == null)
{
throw new ArgumentNullException("httpContext");
}
if (contentPath[0] == '~')
{
return PathHelpers.GenerateClientUrl(httpContext, contentPath);
}
else
{
return contentPath;
}
}
//REVIEW: Should we have an overload that takes Uri?
[SuppressMessage("Microsoft.Design", "CA1054:UriParametersShouldNotBeStrings", Justification = "Needs to take same parameters as HttpUtility.UrlEncode()")]
[SuppressMessage("Microsoft.Performance", "CA1822:MarkMembersAsStatic", Justification = "For consistency, all helpers are instance methods.")]
public string Encode(string url)
{
return HttpUtility.UrlEncode(url);
}
private string GenerateUrl(string routeName, string actionName, string controllerName, RouteValueDictionary routeValues)
{
return GenerateUrl(routeName, actionName, controllerName, routeValues, RouteCollection, RequestContext, true /* includeImplicitMvcValues */);
}
[SuppressMessage("Microsoft.Design", "CA1055:UriReturnValuesShouldNotBeStrings", Justification = "As the return value will used only for rendering, string return value is more appropriate.")]
public static string GenerateUrl(string routeName, string actionName, string controllerName, string protocol, string hostName, string fragment, RouteValueDictionary routeValues, RouteCollection routeCollection, RequestContext requestContext, bool includeImplicitMvcValues)
{
string url = GenerateUrl(routeName, actionName, controllerName, routeValues, routeCollection, requestContext, includeImplicitMvcValues);
if (url != null)
{
if (!String.IsNullOrEmpty(fragment))
{
url = url + "#" + fragment;
}
if (!String.IsNullOrEmpty(protocol) || !String.IsNullOrEmpty(hostName))
{
Uri requestUrl = requestContext.HttpContext.Request.Url;
protocol = (!String.IsNullOrEmpty(protocol)) ? protocol : Uri.UriSchemeHttp;
hostName = (!String.IsNullOrEmpty(hostName)) ? hostName : requestUrl.Host;
string port = String.Empty;
string requestProtocol = requestUrl.Scheme;
if (String.Equals(protocol, requestProtocol, StringComparison.OrdinalIgnoreCase))
{
port = requestUrl.IsDefaultPort ? String.Empty : (":" + Convert.ToString(requestUrl.Port, CultureInfo.InvariantCulture));
}
url = protocol + Uri.SchemeDelimiter + hostName + port + url;
}
}
return url;
}
[SuppressMessage("Microsoft.Design", "CA1055:UriReturnValuesShouldNotBeStrings", Justification = "As the return value will used only for rendering, string return value is more appropriate.")]
public static string GenerateUrl(string routeName, string actionName, string controllerName, RouteValueDictionary routeValues, RouteCollection routeCollection, RequestContext requestContext, bool includeImplicitMvcValues)
{
if (routeCollection == null)
{
throw new ArgumentNullException("routeCollection");
}
if (requestContext == null)
{
throw new ArgumentNullException("requestContext");
}
RouteValueDictionary mergedRouteValues = RouteValuesHelpers.MergeRouteValues(actionName, controllerName, requestContext.RouteData.Values, routeValues, includeImplicitMvcValues);
VirtualPathData vpd = routeCollection.GetVirtualPathForArea(requestContext, routeName, mergedRouteValues);
if (vpd == null)
{
return null;
}
string modifiedUrl = PathHelpers.GenerateClientUrl(requestContext.HttpContext, vpd.VirtualPath);
return modifiedUrl;
}
[SuppressMessage("Microsoft.Design", "CA1054:UriParametersShouldNotBeStrings", MessageId = "0#", Justification = "Response.Redirect() takes its URI as a string parameter.")]
public bool IsLocalUrl(string url)
{
// TODO this should call the System.Web.dll API once it gets added to the framework and MVC takes a dependency on it.
return RequestExtensions.IsUrlLocalToHost(RequestContext.HttpContext.Request, url);
}
[SuppressMessage("Microsoft.Design", "CA1055:UriReturnValuesShouldNotBeStrings", Justification = "As the return value will used only for rendering, string return value is more appropriate.")]
public string RouteUrl(object routeValues)
{
return RouteUrl(null /* routeName */, routeValues);
}
[SuppressMessage("Microsoft.Design", "CA1055:UriReturnValuesShouldNotBeStrings", Justification = "As the return value will used only for rendering, string return value is more appropriate.")]
public string RouteUrl(RouteValueDictionary routeValues)
{
return RouteUrl(null /* routeName */, routeValues);
}
[SuppressMessage("Microsoft.Design", "CA1055:UriReturnValuesShouldNotBeStrings", Justification = "As the return value will used only for rendering, string return value is more appropriate.")]
public string RouteUrl(string routeName)
{
return RouteUrl(routeName, (object)null /* routeValues */);
}
[SuppressMessage("Microsoft.Design", "CA1055:UriReturnValuesShouldNotBeStrings", Justification = "As the return value will used only for rendering, string return value is more appropriate.")]
public string RouteUrl(string routeName, object routeValues)
{
return RouteUrl(routeName, routeValues, null /* protocol */);
}
[SuppressMessage("Microsoft.Design", "CA1055:UriReturnValuesShouldNotBeStrings", Justification = "As the return value will used only for rendering, string return value is more appropriate.")]
public string RouteUrl(string routeName, RouteValueDictionary routeValues)
{
return RouteUrl(routeName, routeValues, null /* protocol */, null /* hostName */);
}
[SuppressMessage("Microsoft.Design", "CA1055:UriReturnValuesShouldNotBeStrings", Justification = "As the return value will used only for rendering, string return value is more appropriate.")]
public string RouteUrl(string routeName, object routeValues, string protocol)
{
return GenerateUrl(routeName, null /* actionName */, null /* controllerName */, protocol, null /* hostName */, null /* fragment */, new RouteValueDictionary(routeValues), RouteCollection, RequestContext, false /* includeImplicitMvcValues */);
}
[SuppressMessage("Microsoft.Design", "CA1055:UriReturnValuesShouldNotBeStrings", Justification = "As the return value will used only for rendering, string return value is more appropriate.")]
public string RouteUrl(string routeName, RouteValueDictionary routeValues, string protocol, string hostName)
{
return GenerateUrl(routeName, null /* actionName */, null /* controllerName */, protocol, hostName, null /* fragment */, routeValues, RouteCollection, RequestContext, false /* includeImplicitMvcValues */);
}
}
}