如何创buildASP.NET Web API Url?

在ASP.NET MVC中,我们有@Url.Action的动作。 是否有类似@Url.Api这将路由到/ api /控制器?

ApiController有一个叫做Url的属性,它的types是System.Web.Http.Routing.UrlHelper ,它允许你为api控制器构buildurl。

例:

 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"; } ... } 

UrlHelper既不存在于您的视图中,也不存在于标准控制器中。


更新:

而为了做一个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 } ); 

它使用Url.Action的更简单的forms,因此你不必引用任何路由名称:

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

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

希望能够以types安全的方式生成链接,而不使用硬编码string(控制器名称)?

这里有一个nuget! (这是马克·西曼写的)

https://github.com/ploeh/Hyprlinkr

像这样工作:

路线,像往常一样:

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

获取url:

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

结果:

 http://localhost/api/foo/1337 

这是用于回答这个问题的KISS方法:

如果这是您将用于创buildMVC控制器URL的代码

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

为了获得控制器的API版本的URL(假设您使用相同的控制器名称),您可以使用

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

所有的Url.Action方法正在做的是追加应用程序的根path,控制器名称,后跟动作名称(除非它是“索引”,在这种情况下,它不会被追加。如果path值对象有一个ID属性值也被附加到URL。