2012-02-29 41 views

回答

123

ApiController有一個名爲Url的屬性,它的類型爲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"; 
    } 

    ... 
} 

這UrlHelper不存在既不是你的意見,也沒有在標準控制器。


UPDATE:

而且爲了做一個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 } 
); 
+0

這真的沒有多大幫助,因爲我需要我的視圖才能夠以安全的方式生成Url。如果存在Go Live許可證,那麼在視圖上創建網址的「Go Live」方式是什麼? – 2012-02-29 16:16:45

+0

更重要的是,如果您使用ASP.Net Development Server,這將無法正常工作,因爲它始終更改端口,因此您甚至無法在視圖中強制該URL。 – 2012-02-29 16:18:35

+0

@ShaneCourtrille,我已經更新了我的答案,以說明如何使用普通的'System.Web.Mvc.UrlHelper'來生成HttpControllerContext之外的Api路由。 – 2012-02-29 16:39:30

41

它的工作原理與Url.Action簡單的形式,所以你不必引用任何路由名稱:

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

如果在區域內需要URL,您可能需要添加area = ""。 (Api控制器在默認情況下在區域之外)我使用的是MVC 4.

+7

Web Api中的UrlHelper是http:// msdn。microsoft.com/en-us/library/system.web.http.routing.urlhelper(v=vs.108).aspx,它沒有操作方法。 – 2013-09-20 15:26:18

+6

@YuriyFaktorovich這篇文章暗示'Url.Action'正在使用從一個視圖。 'Url'的類型是'System.Web.Mvc.UrlHelper',它不映射到'WebApi'路由。這就是爲什麼你需要額外的參數:'new {httproute =「」}'。 – Jesse 2013-09-24 21:26:57

+3

我已添加'httproute「」''但它不是映射=/ – Maslow 2013-11-08 20:25:59

4

希望能夠以類型安全的方式生成鏈接,而不使用硬編碼的字符串(控制器名稱)?

這裏有一個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 
0

這裏是回答這個問題的KISS方法:

如果是這樣,你會用它來創建一個MVC控制器URL

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

爲了得到一個URL的API代碼控制器的版本(假設你使用相同的控制器名稱),你可以使用

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

所有Url.Action方法做的是附加的應用程序的根路徑,與C控制器名稱,後跟動作名稱(除非它是「索引」,在這種情況下它不會被追加。如果路由值對象具有id屬性,則該值也會附加到該URL。