added Link method to IUrlHelper
This commit is contained in:
parent
48a1cbb0e5
commit
3d30fd653e
|
|
@ -60,10 +60,9 @@ namespace Microsoft.AspNet.Mvc
|
|||
/// <inheritdoc />
|
||||
protected override void OnFormatting([NotNull] ActionContext context)
|
||||
{
|
||||
var request = context.HttpContext.Request;
|
||||
var urlHelper = UrlHelper ?? context.HttpContext.RequestServices.GetRequiredService<IUrlHelper>();
|
||||
|
||||
var url = urlHelper.RouteUrl(RouteName, RouteValues, request.Scheme, request.Host.ToUriComponent());
|
||||
var url = urlHelper.Link(RouteName, RouteValues);
|
||||
|
||||
if (string.IsNullOrEmpty(url))
|
||||
{
|
||||
|
|
|
|||
|
|
@ -55,5 +55,16 @@ namespace Microsoft.AspNet.Mvc
|
|||
/// <param name="routeContext">The context object for the generated URLs for a route.</param>
|
||||
/// <returns>The fully qualified or absolute URL.</returns>
|
||||
string RouteUrl([NotNull] UrlRouteContext routeContext);
|
||||
|
||||
/// <summary>
|
||||
/// Generates an absolute URL using the specified route name and values.
|
||||
/// </summary>
|
||||
/// <param name="routeName">The name of the route that is used to generate the URL.</param>
|
||||
/// <param name="values">An object that contains the route values.</param>
|
||||
/// <returns>The generated absolute URL.</returns>
|
||||
/// <remarks>
|
||||
/// The protocol and host is obtained from the current request.
|
||||
/// </remarks>
|
||||
string Link(string routeName, object values);
|
||||
}
|
||||
}
|
||||
|
|
|
|||
|
|
@ -127,6 +127,18 @@ namespace Microsoft.AspNet.Mvc
|
|||
return GenerateClientUrl(_httpContext.Request.PathBase, contentPath);
|
||||
}
|
||||
|
||||
/// <inheritdoc />
|
||||
public virtual string Link(string routeName, object values)
|
||||
{
|
||||
return RouteUrl(new UrlRouteContext()
|
||||
{
|
||||
RouteName = routeName,
|
||||
Values = values,
|
||||
Protocol = _httpContext.Request.Scheme,
|
||||
Host = _httpContext.Request.Host.ToUriComponent()
|
||||
});
|
||||
}
|
||||
|
||||
private static string GenerateClientUrl([NotNull] PathString applicationPath,
|
||||
[NotNull] string path)
|
||||
{
|
||||
|
|
|
|||
|
|
@ -115,7 +115,7 @@ namespace Microsoft.AspNet.Mvc
|
|||
private static IUrlHelper GetMockUrlHelper(string returnValue)
|
||||
{
|
||||
var urlHelper = new Mock<IUrlHelper>();
|
||||
urlHelper.Setup(o => o.RouteUrl(It.IsAny<UrlRouteContext>())).Returns(returnValue);
|
||||
urlHelper.Setup(o => o.Link(It.IsAny<string>(), It.IsAny<object>())).Returns(returnValue);
|
||||
|
||||
return urlHelper.Object;
|
||||
}
|
||||
|
|
|
|||
|
|
@ -613,6 +613,11 @@ namespace Microsoft.AspNet.Mvc
|
|||
throw new NotImplementedException();
|
||||
}
|
||||
|
||||
public string Link(string routeName, object values)
|
||||
{
|
||||
throw new NotImplementedException();
|
||||
}
|
||||
|
||||
public string RouteUrl(UrlRouteContext routeContext)
|
||||
{
|
||||
Assert.Equal(_routeName, routeContext.RouteName);
|
||||
|
|
|
|||
|
|
@ -728,6 +728,82 @@ namespace Microsoft.AspNet.Mvc
|
|||
Assert.Equal("https://remotelyhost/app/home3/contact#somefragment", url);
|
||||
}
|
||||
|
||||
[Fact]
|
||||
public void LinkWithAllParameters_ReturnsExpectedResult()
|
||||
{
|
||||
// Arrange
|
||||
var services = GetServices();
|
||||
var urlHelper = CreateUrlHelperWithRouteCollection(services, "/app");
|
||||
|
||||
// Act
|
||||
var url = urlHelper.Link("namedroute",
|
||||
new
|
||||
{
|
||||
Action = "newaction",
|
||||
Controller = "home",
|
||||
id = "someid"
|
||||
});
|
||||
|
||||
// Assert
|
||||
Assert.Equal("http://localhost/app/named/home/newaction/someid", url);
|
||||
}
|
||||
|
||||
[Fact]
|
||||
public void LinkWithNullRouteName_ReturnsExpectedResult()
|
||||
{
|
||||
// Arrange
|
||||
var services = GetServices();
|
||||
var urlHelper = CreateUrlHelperWithRouteCollection(services, "/app");
|
||||
|
||||
// Act
|
||||
var url = urlHelper.Link(null,
|
||||
new
|
||||
{
|
||||
Action = "newaction",
|
||||
Controller = "home",
|
||||
id = "someid"
|
||||
});
|
||||
|
||||
// Assert
|
||||
Assert.Equal("http://localhost/app/home/newaction/someid", url);
|
||||
}
|
||||
|
||||
[Fact]
|
||||
public void LinkWithDefaultsAndNullRouteValues_ReturnsExpectedResult()
|
||||
{
|
||||
// Arrange
|
||||
var services = GetServices();
|
||||
var routeCollection = GetRouter(services, "MyRouteName", "any/url");
|
||||
var urlHelper = CreateUrlHelper("/app", routeCollection);
|
||||
|
||||
// Act
|
||||
var url = urlHelper.Link("MyRouteName", null);
|
||||
|
||||
// Assert
|
||||
Assert.Equal("http://localhost/app/any/url", url);
|
||||
}
|
||||
|
||||
[Fact]
|
||||
public void LinkWithCustomHostAndProtocol_ReturnsExpectedResult()
|
||||
{
|
||||
// Arrange
|
||||
var services = GetServices();
|
||||
var routeCollection = GetRouter(services, "MyRouteName", "any/url");
|
||||
var urlHelper = CreateUrlHelper("myhost", "https", routeCollection);
|
||||
|
||||
// Act
|
||||
var url = urlHelper.Link("namedroute",
|
||||
new
|
||||
{
|
||||
Action = "newaction",
|
||||
Controller = "home",
|
||||
id = "someid"
|
||||
});
|
||||
|
||||
// Assert
|
||||
Assert.Equal("https://myhost/named/home/newaction/someid", url);
|
||||
}
|
||||
|
||||
private static HttpContext CreateHttpContext(
|
||||
IServiceProvider services,
|
||||
string appRoot)
|
||||
|
|
@ -782,6 +858,19 @@ namespace Microsoft.AspNet.Mvc
|
|||
return new UrlHelper(actionContext, actionSelector.Object);
|
||||
}
|
||||
|
||||
private static UrlHelper CreateUrlHelper(string host, string protocol, IRouter router)
|
||||
{
|
||||
var services = GetServices();
|
||||
var context = CreateHttpContext(services, string.Empty);
|
||||
context.Request.Host = new HostString(host);
|
||||
context.Request.Scheme = protocol;
|
||||
|
||||
var actionContext = CreateActionContext(context, router);
|
||||
|
||||
var actionSelector = new Mock<IActionSelector>(MockBehavior.Strict);
|
||||
return new UrlHelper(actionContext, actionSelector.Object);
|
||||
}
|
||||
|
||||
private static UrlHelper CreateUrlHelper(IScopedInstance<ActionContext> contextAccessor)
|
||||
{
|
||||
var actionSelector = new Mock<IActionSelector>(MockBehavior.Strict);
|
||||
|
|
|
|||
Loading…
Reference in New Issue