Trong ASP.NET MVC, chúng ta có @Url.Action
các hành động. Có cái gì đó tương tự như @Url.Api
vậy sẽ định tuyến đến / api / controller không?
Trong ASP.NET MVC, chúng ta có @Url.Action
các hành động. Có cái gì đó tương tự như @Url.Api
vậy sẽ định tuyến đến / api / controller không?
Câu trả lời:
Các ApiController có một tài sản gọi là Url đó là loại System.Web.Http.Routing.UrlHelper cho phép bạn xây dựng các url cho bộ điều khiển api.
Thí 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 trong chế độ xem của bạn cũng như trong bộ điều khiển tiêu chuẩn.
CẬP NHẬT:
Và để thực hiện định tuyến bên ngoài 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 chế độ xem:
<script type="text/javascript">
var url = '@Url.RouteUrl("DefaultApi", new { httproute = "", controller = "values", id = "123" })';
$.ajax({
url: url,
type: 'GET',
success: function(result) {
// ...
}
});
</script>
Lưu ý httproute = ""
mã thông báo tuyến đường là 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 thức RegisterRoutes của bạn trong Global.asax
:
routes.MapHttpRoute(
name: "DefaultApi",
routeTemplate: "api/{controller}/{id}",
defaults: new { id = RouteParameter.Optional }
);
System.Web.Mvc.UrlHelper
để tạo các tuyến Api bên ngoài HttpControllerContext.
Nó hoạt động với dạng đơn giản hơn, Url.Action
do đó bạn không phải tham chiếu đến bất kỳ tên Định tuyến nào:
Url.Action("ActionName", "ControllerName", new { httproute = "DefaultApi" })
Bạn có thể muốn thêm một area = ""
nếu URL cần thiết trong một Khu vực. (Bộ điều khiển Api nằm ngoài Khu vực theo mặc định.) Tôi đang sử dụng MVC 4.
Url.Action
đang được sử dụng từ Chế độ xem. Url
là loại System.Web.Mvc.UrlHelper
và nó không ánh xạ đến WebApi
các tuyến đường. Đây là lý do tại sao bạn cần tham số phụ: new { httproute = "" }
.
httproute""
nhưng nó không phải là ánh xạ = /
@Html.ActionLink("link", "Get", "Servers", new { id = r.idServer, area = "", httproute = "" }, null)
nhưng điều đó hoạt động hoàn hảo
Bạn muốn có thể tạo liên kết theo cách an toàn, không có chuỗi mã cứng (tên bộ điều khiển)?
Có một điều đó! (và nó được viết bởi Mark Seeman)
https://github.com/ploeh/Hyprlinkr
Hoạt động như thế này:
Các tuyến đường, như thường lệ:
name: "API Default",
routeTemplate: "api/{controller}/{id}",
defaults: new { id = RouteParameter.Optional }
Nhận một URL:
var linker = new RouteLinker(request);
var uri = linker.GetUri<FooController>(r => r.GetById(1337));
Kết quả:
http://localhost/api/foo/1337
Đây là phương pháp KISS để trả lời câu hỏi:
Nếu đây là mã mà bạn sẽ sử dụng để tạo URL bộ điều khiển MVC
@Url.Action("Edit", "MyController")
Để lấy URL cho phiên bản API 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ả những gì mà phương thức Url.Action đang làm là nối thêm đường dẫn gốc của ứng dụng, với tên bộ điều khiển, theo sau là tên hành động (trừ khi nó là "Chỉ mục", trong trường hợp đó nó không được nối nếu đối tượng giá trị định tuyến có id thuộc tính giá trị cũng được thêm vào URL.
api/
trước tên bộ điều khiển của tôi.