ASP.NET Web API generate url using Url.Action

54,947

Solution 1

Maybe the closest helper to Url.Action in Web Api Controller is the Url.Link method which will generate the url by Route name, Controller Name, Action Name and the route parameters (if needed).

Here is a simple example

The default App_start/RouteConfig.cs

routes.MapRoute(
    name: "Default",
    url: "{controller}/{action}/{id}",
    defaults: new { controller = "Home", action = "Index", id = UrlParameter.Optional }
);

The Web Api Controller:

public class MyWebApiController : ApiController
{
    public string Get()
    {
        var url = this.Url.Link("Default", new { Controller = "MyMvc", Action = "MyAction", param1 = 1, param2 = "somestring" });
        return url;
    }
}

The MVC Controller

public class MyMvcController : Controller
{
    public ActionResult MyAction(int param1, string param2)
    {
        // ...
    }
}

The generated url by the WebApi controller will be http://myDomain/MyMvc/MyAction?param1=1&param2=somestring.

I didn't find how to pass the protocol/url schema but at the and it will be just a string and you can manipulate it if you know what the protocol should be.

Hope this helps.

EDIT:

This may help for the protocol part: Generate HTTPS link in Web API using Url.Link

Solution 2

This expands on the answer by VictorBahtev to mention ASP.NET CORE.

In 2020 there is a chance that your project is targeting ASP.NET Core 3.1. In the current version of WebAPI there is a method available to do the trick requested exactly by the OP. The method below doesn't require a route parameter (which OP didn't provide):

string url = this.Url.ActionLink("ActionName", "ControllerName", new { product = product.Id, price = price, ..}[, protocol = null, host = null, string fragment = null]);
Share:
54,947

Related videos on Youtube

David Dury
Author by

David Dury

Updated on August 22, 2020

Comments

  • David Dury
    David Dury over 3 years

    How can I generate the same url but in Web Api ?

    var url = Url.Action("Action", "Controller", new { product = product.Id, price = price }, protocol: Request.Url.Scheme);
    

    P.S.

    The url should be generated to an MVC controller/action but from within web api.

    So basically: make a get request to my api/generateurl and that will return an url to :

    http://domain.com/controller/action?product=productId&price=100
    
  • Nathiel Barros
    Nathiel Barros almost 7 years
    what the Default means?
  • Viktor Bahtev
    Viktor Bahtev almost 7 years
    Default is the name of the route. See RouteConfig.cs
  • developer
    developer about 6 years
    This doesn't appear to work if the WebAPI2 controller is decorated with a RoutePrefix [RoutePrefix("api/MyContoller")] you will get a base URL followed by controller name, instead of the desired base URL followed by the route prefix. i.e. you get: HOST/MyContoller/MyAction instead of HOST/api/MyContoller/MyAction, (Where api/MyContoller is my rout prefix - which happens to contain my controller name) suspect similar problem if the Action has a Route decoration.
  • developer
    developer about 6 years
    I needed to get the URL of an action on the same controller, and was using the RoutePrefix & Route decorators. I found that calling Url.Content("MyRoute/"); (Where "MyRoute" was the name of the Route decorating a different Action in same controller) worked well. it gave me {HOST}/{ROUTE-PREFIX}/{ROUTE} rather than {HOST}/{CONTROLLER}/{ACTION} (which would never resolve)