在 ASP.NET MVC 中,我们使用 @Url.Action来执行操作。是否有类似于 @Url.Api的路由到/api/controller?
@Url.Action
@Url.Api
苹果控制器有一个名为 厄尔的属性,类型为 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 = ""路由令牌。
httproute = ""
显然,这里假设您的 Api 路由在 Global.asax的 RegisterRoutes 方法中被称为 DefaultApi:
Global.asax
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
Url.Action("ActionName", "ControllerName", new { httproute = "DefaultApi" })
如果某个区域内需要 URL,则可能需要添加 area = ""。(默认情况下,Api 控制器在 Area 之外。)我用的是 MVC4。
area = ""
希望能够以类型安全的方式生成链接,而不需要硬编码字符串(控制器名称) ?
有一个关于这个的难题! (这是马克西曼写的)
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。