//-------------------- COMMON LINK PROPERTY GENERATION METHODS ---------------------- public ControllerActionLink BuildActionUrlLink <TController>(Expression <Action <TController, TResource> > action) where TController : ControllerBase { if (action == null) { throw new ArgumentNullException(nameof(action), "Controller Action selector cannot be null."); } var resourceLink = new ControllerActionLink(); var actionSelector = new ControllerActionRouteSelector <TController, TResource>(resourceLink, action); actionSelector.SetRouteInfo(); return(resourceLink); }
// Called for action link containing information based on an expression, specified at compile time, selecting a // controller's action method. The expression also specifies which resource properties should be used for // the action's route parameters. private Link SetLinkUrl(ResourceContext context, ControllerActionLink resourceLink) { string controllerName = resourceLink.Controller.Replace("Controller", string.Empty); var routeValues = GetResourceRouteValues(context, resourceLink); var link = new Link { // Delegate to ASP.NET Core to get the URL corresponding to the route-values. Href = context.UrlHelper.Action(resourceLink.Action, controllerName, routeValues), Templated = false, Methods = resourceLink.Methods.ToArray() }; UpdateLinkDescriptorsAndResource(context, resourceLink, link); return(link); }
// For each controller action argument execute the cached expression on the resource // to get the corresponding resource property value for that route parameter. private static Dictionary <string, object> GetResourceRouteValues(ResourceContext context, ControllerActionLink resourceLink) { var modelRouteValues = new Dictionary <string, object>(resourceLink.RouteParameters.Count); foreach (RouteParameter routeParam in resourceLink.RouteParameters) { modelRouteValues[routeParam.ActionParamName] = routeParam.GetPropValue(context.Resource); } return(modelRouteValues); }