2012-02-29 37 views

Trả lời

123

ApiController có thuộc tính được gọi là Url thuộc loại System.Web.Http.Routing.UrlHelper cho phép bạn tạo url cho bộ điều khiển api.

Ví dụ:

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 này không tồn tại không phải trong quan điểm của bạn cũng không phải trong các bộ điều khiển tiêu chuẩn.


UPDATE:

Và để làm việc định tuyến bên ngoài của một ApiController bạn có thể làm như sau:

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

hoặc bên trong một cái nhìn:

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

Thông báo các httproute = "" mã thông báo lộ trình quan trọng.

Rõ ràng điều này giả định rằng tuyến đường Api của bạn được gọi DefaultApi trong phương pháp RegisterRoutes của bạn trong Global.asax:

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

Điều đó thực sự không giúp tôi nhiều vì tôi cần Chế độ xem của tôi để có thể tạo Url một cách an toàn. Nếu có giấy phép Go Live, cách 'Phát trực tiếp' để tạo url trên Chế độ xem là gì? –

+0

Quan trọng hơn là điều này sẽ không hoạt động nếu bạn đang sử dụng ASP.Net Development Server vì nó thay đổi cổng mọi lúc, do đó bạn thậm chí không thể tìm thấy url trong khung nhìn. –

+0

@ShaneCourtrille, tôi đã cập nhật câu trả lời của mình để minh họa cách bạn có thể sử dụng 'System.Web.Mvc.UrlHelper' bình thường để tạo ra các tuyến Api bên ngoài một HttpControllerContext. –

41

Nó hoạt động với hình thức đơn giản của Url.Action do đó bạn không cần phải tham khảo bất kỳ tên Routing:

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

Bạn có thể muốn thêm area = "" nếu cần URL trong một Khu vực. (Mặc định là các bộ điều khiển Api bên ngoài các Vùng.) Tôi đang sử dụng MVC 4.

+7

UrlHelper trong Web Api là http: // msdn.microsoft.com/en-us/library/system.web.http.routing.urlhelper(v=vs.108).aspx, nó không có phương thức hành động. –

+6

@YuriyFaktorovich Bài đăng này ngụ ý rằng 'Url.Action' đang được sử dụng từ Chế độ xem. 'Url' thuộc loại' System.Web.Mvc.UrlHelper' và nó không ánh xạ tới các tuyến 'WebApi'. Đây là lý do tại sao bạn cần tham số bổ sung: 'new {httproute =" "}'. – Jesse

+3

Tôi đã thêm 'httproute" "' nhưng nó không được ánh xạ =/ – Maslow

4

Muốn có thể tạo liên kết theo cách an toàn, không có chuỗi cứng (tên bộ điều khiển)?

Có một cái nuget cho điều đó!(Và nó được viết bởi Mark Seeman)

https://github.com/ploeh/Hyprlinkr

trình như thế này:

đường, như thường lệ:

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

Get URL:

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

Kết quả:

http://localhost/api/foo/1337 
0

Dưới đây là phương pháp KISS để trả lời câu hỏi:

Nếu đây là đoạn code mà bạn sẽ sử dụng để tạo ra một URL khiển MVC

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

Để có được một URL cho API phiên bản của bộ điều khiển (giả sử bạn sử dụng cùng tên bộ điều khiển), bạn có thể sử dụng

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

Tất cả các phương thức đang thực hiện đang thêm đường dẫn gốc của ứng dụng, với c ontroller name, theo sau là tên hành động (trừ khi nó là "Index" trong trường hợp nó không được nối thêm. nếu đối tượng giá trị tuyến đường có thuộc tính id thì giá trị cũng được nối vào URL.

Các vấn đề liên quan