/// <inheritdoc /> public override string Action(UrlActionContext urlActionContext) { if (urlActionContext == null) { throw new ArgumentNullException(nameof(urlActionContext)); } var valuesDictionary = GetValuesDictionary(urlActionContext.Values); if (urlActionContext.Action == null) { if (!valuesDictionary.ContainsKey("action") && AmbientValues.TryGetValue("action", out var action)) { valuesDictionary["action"] = action; } } else { valuesDictionary["action"] = urlActionContext.Action; } if (urlActionContext.Controller == null) { if (!valuesDictionary.ContainsKey("controller") && AmbientValues.TryGetValue("controller", out var controller)) { valuesDictionary["controller"] = controller; } } else { valuesDictionary["controller"] = urlActionContext.Controller; } var endpoints = _routeValuesBasedEndpointFinder.FindEndpoints( new RouteValuesBasedEndpointFinderContext() { ExplicitValues = valuesDictionary, AmbientValues = AmbientValues }); var successfullyGeneratedLink = _linkGenerator.TryGetLink( endpoints, valuesDictionary, AmbientValues, out var link); if (!successfullyGeneratedLink) { //TODO: log here return(null); } return(GenerateUrl(urlActionContext.Protocol, urlActionContext.Host, link, urlActionContext.Fragment)); }