如何创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。