2013-08-15 33 views
10

Để liên kết đến Controller/A/<anId> Tôi làm điều này:Làm thế nào để liên kết tốt nhất để một bộ điều khiển API

@Html.ActionLink(anId, "Action", "Controller", new {id = anId}) 

hành động được nhấn mạnh bởi Resharper và tôi có thể điều hướng đến nó với F12.

Nhưng tôi có một liên kết đến một bộ điều khiển api:

@Html.ActionLink("API Version", "../api/controller/", new {id = anId}) 

này không có một lựa chọn resharper hàng hải và sẽ không refactored nếu tôi đổi tên bộ điều khiển. Có cách nào sạch hơn để liên kết với một APIController từ một cái nhìn dao cạo? Đặc biệt một Resharper nhận ra.

Trả lời

5

Bạn thực sự phải cập nhật các tuyến api, vì api theo mặc định không bao gồm một hành động.

Vì vậy, thêm tuyến đường này:

config.Routes.MapHttpRoute(
    name: "ActionRoute", 
    routeTemplate: "api/{controller}/{action}/{id}", 
    defaults: new { id = RouteParameter.Optional } 
); 

Sau đó bạn có thể tạo một liên kết như sau:

@Url.RouteUrl("ActionRoute", new {httproute= "", controller = "controller", action = "action"}); 

EDIT

Tôi đọc lại câu hỏi của bạn và nó doesn không nói bất cứ điều gì về một hành động, vì vậy tôi chỉ giả định rằng, dù bằng cách nào, bạn vẫn có thể sử dụng @Url.RouterUrl:

@Url.RouteUrl("DefaultApi", new {httproute= "", controller = "controller"}); 
+0

Câu trả lời hay. Lưu ý lỗi đánh máy cho RouteParameter (không phải RouterParameter). – iCode

3

I dunno về Resharper nhưng bạn có thể làm điều này:

@Html.ActionLink(
    "API Version", 
    "Action", 
    "Controller", 
    new { id = anId, httproute = "" }, 
    null 
) 

Nếu bạn vượt qua httproute = "", các helper sẽ tạo ra một địa chỉ để điều khiển API của bạn sử dụng định nghĩa định tuyến của nó.

+0

Tôi đã phải sử dụng quá tải thay thế (vui lòng xem lại chỉnh sửa), nhưng liên kết tôi nhận được là 'http: // localhost: 64404/Controller/Action/anId' Không đề cập đến' api'. – weston

+0

Khi tôi sử dụng nó như bạn nói, tôi nhận được liên kết 'http: // localhost: 64404/source/Action? Length = 10' – weston

+0

Gần nhất cho đến nay:' @ Html.ActionLink ("Phiên bản API", null, new {id = Model.Id.Name, httproute = ""}) 'yields:' http: // localhost: 64404/api/controller/anId? Action = detail' – weston

8

Như câu trả lời khác đã gợi ý đã có, bạn có thể sử dụng Url.RouteUrl như vậy:

@Url.RouteUrl("DefaultApi", new {httproute= "", controller = "MyApiController"}); 

Bạn cũng có thể sử dụng phương pháp shortcut Url.HttpRouteUrl thay vì như vậy:

@Url.HttpRouteUrl("DefaultApi", new { controller = "MyApiController" }) 

"DefaultApi" là tên tuyến mặc định khi tạo dự án WebApi mới. Chuỗi này phải khớp với bất kỳ tên nào bạn đã cung cấp HttpRoute của mình trong tệp WebApiConfig.cs.

Cả hai giải pháp này sẽ chỉ giúp bạn tạo URL cho tuyến đường, chúng sẽ không thực sự tạo liên kết HTML cho bạn. Bạn cần phải sử dụng chúng như thế này:

<a href="@Url.HttpRouteUrl("DefaultApi", new { controller = "MyApiController" })">My Link Text</a> 

Nếu bạn muốn Razor để tạo ra các thẻ HTML neo cho bạn, bạn có thể sử dụng phương pháp này để thay thế:

@Html.RouteLink("My Link Text", "DefaultApi", new { controller = "MyApiController" }) 

Phương pháp này cung cấp một giao diện rất giống với @Html.ActionLink được sử dụng cho các liên kết Bộ điều khiển/Hành động thông thường.

Tất cả các giải pháp này cho phép nhấp qua để làm việc với ReSharper.

+0

Tôi thích giải pháp này vì nó giúp loại bỏ sự cần thiết của tham số httproute = "" rõ ràng. –

+0

@ Html.RouteLink() không cung cấp url thích hợp. Tôi đã kiểm tra nó trong MVC 5 – yogihosting

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