ASP.NET Web API生成使用Url.Action的URL

45

我该如何在Web API中生成相同的URL?

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

P.S.

该URL应该在Web API内生成到MVC控制器/操作。

因此,基本上:向我的api/generateurl发出GET请求,它将返回一个URL:

http://example.com/controller/action?product=productId&price=100
2个回答

57

在Web API控制器中,与Url.Action最相似的助手可能是Url.Link方法,它将通过路由名称、控制器名称、操作名称和路由参数(如果需要)生成URL。

这里提供了一个简单的示例。

默认的App_start/RouteConfig.cs

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

Web API 控制器:

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

MVC控制器

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

WebApi控制器生成的URL将是http://myDomain/MyMvc/MyAction?param1=1&param2=somestring

我没有找到如何传递协议/url模式,但最终它只会成为一个字符串,如果您知道协议应该是什么,就可以操纵它。

这可能对协议部分有所帮助:在Web API中使用Url.Link生成HTTPS链接


“Default” 的意思是什么? - Nathiel Barros
Default is the name of the route. See RouteConfig.cs - Viktor Bahtev
如果WebAPI2控制器被装饰为RoutePrefix [RoutePrefix(“api / MyContoller”)],则似乎无法正常工作。您将获得一个基本URL,后跟控制器名称,而不是所需的基本URL,后跟路由前缀。即,您会得到:HOST / MyContoller / MyAction,而不是HOST / api / MyContoller / MyAction,(其中api / MyContoller是我的路由前缀-恰好包含我的控制器名称)。如果操作具有路由装饰,则可能存在类似的问题。 - developer
我需要获取同一控制器上操作的URL,并使用RoutePrefix和Route修饰符。我发现调用Url.Content("MyRoute/");(其中"MyRoute"是在同一控制器中装饰不同操作的路由名称)效果很好。它给了我{HOST}/{ROUTE-PREFIX}/{ROUTE}而不是{HOST}/{CONTROLLER}/{ACTION}(这永远不会解决)。 - developer

2

以下是对VictorBahtev答案的拓展,提到了ASP.NET CORE。

在2020年,你的项目有可能以ASP.NET Core 3.1为目标。在当前版本的WebAPI中,有一个方法可以恰好满足OP所要求的功能。下面的方法不需要路由参数(OP没有提供):

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

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接