I'm rather new to ASP.NET Core, and right now I am trying to get a grasp on how UrlHelper works in general.
In my controller, I want to create an absolute URL to another action in the same controller, e.g. http://localhost:PORT/api/controller/action. The question is now, how do I do it?
I have tried with the following:
var urlHelper = new UrlHelper(new ActionContext());
var url = urlHelper.Action("ACTION", "CONTROLLER");
Furthermore, what are those different contexts like ActionContext?
You really shouldn’t create a
UrlHelperyourself. It’s likely that whatever context you are currently in, there is already anIUrlHelperinstance available:ControllerBase.Urlinside of controllers.PageModel.Urlinside a Razor view.ViewComponent.Urlinside a view component.So chances are, that you can just access
this.Urlto get an URL helper.If you find yourself in a situation where that does not exist, for example when implementing your own service, then you can always inject a
IUrlHelperFactorytogether with theIActionContextAccessorto first retrieve the current action context and then create an URL helper for it.As for what that
ActionContextis, it is basically an object that contains various values that identify the current MVC action context in which the current request is being handled. So it contains information about the actual request, the resolved controller and action, or the model state about the bound model object. It is basically an extension to theHttpContext, also containing MVC-specific information.If you are running ASP.NET Core 2.2 or later, you can also use the
LinkGeneratorinstead of theIUrlHelperinside your services which gives you an easier way to generate URLs compared to having to construct the helper through theIUrlHelperFactory.