How to create ASP.NET Web API Url?

在 ASP.NET MVC 中,我们使用 @Url.Action来执行操作。是否有类似于 @Url.Api的路由到/api/controller?

93868 次浏览

苹果控制器有一个名为 厄尔的属性,类型为 System.Web.Http. Routing. UrlHelper,它允许您为 api 控制器构造 url。

例如:

public class ValuesController : ApiController
{
// GET /api/values
public IEnumerable<string> Get()
{
// returns /api/values/123
string url = Url.Route("DefaultApi", new { controller = "values", id = "123" });
return new string[] { "value1", "value2" };
}


// GET /api/values/5
public string Get(int id)
{
return "value";
}


...
}

This UrlHelper doesn't exist neither in your views nor in the standard controllers.


更新:

为了在 ApiController 之外进行路由,您可以执行以下操作:

public class HomeController : Controller
{
public ActionResult Index()
{
string url = Url.RouteUrl(
"DefaultApi",
new { httproute = "", controller = "values", id = "123" }
);
return View();
}
}

或在视野内:

<script type="text/javascript">
var url = '@Url.RouteUrl("DefaultApi", new { httproute = "", controller = "values", id = "123" })';
$.ajax({
url: url,
type: 'GET',
success: function(result) {
// ...
}
});
</script>

请注意重要的 httproute = ""路由令牌。

显然,这里假设您的 Api 路由在 Global.asax的 RegisterRoutes 方法中被称为 DefaultApi:

routes.MapHttpRoute(
name: "DefaultApi",
routeTemplate: "api/{controller}/{id}",
defaults: new { id = RouteParameter.Optional }
);

It works with the simpler form of Url.Action thus you don't have to reference any Routing names:

Url.Action("ActionName", "ControllerName", new { httproute = "DefaultApi" })

如果某个区域内需要 URL,则可能需要添加 area = ""。(默认情况下,Api 控制器在 Area 之外。)我用的是 MVC4。

希望能够以类型安全的方式生成链接,而不需要硬编码字符串(控制器名称) ?

有一个关于这个的难题! (这是马克西曼写的)

Https://github.com/ploeh/hyprlinkr

工作原理是这样的:

路线如常:

name: "API Default",
routeTemplate: "api/{controller}/{id}",
defaults: new { id = RouteParameter.Optional }

获取网址:

var linker = new RouteLinker(request);
var uri = linker.GetUri<FooController>(r => r.GetById(1337));

结果:

http://localhost/api/foo/1337

以下是回答这个问题的 KISS 方法:

如果这是用来创建 MVC 控制器 URL 的代码

@Url.Action("Edit", "MyController")

In order to get a URL for the API version of the controller (assuming you use the same controller name) you can use

@Url.Action("Edit", "api/MyController")

所有的 Url。Action 方法所做的是追加应用程序的根路径,使用控制器名称,后跟操作名称(除非它是“ Index”,在这种情况下它没有被追加。如果路由值对象具有 id 属性,则该值也会附加到 URL。