У ASP.NET MVC у нас є @Url.Action
дії. Чи є щось подібне, як @Url.Api
би перейти до / api / контролер?
У ASP.NET MVC у нас є @Url.Action
дії. Чи є щось подібне, як @Url.Api
би перейти до / api / контролер?
Відповіді:
ApiController має властивість Url який має тип System.Web.Http.Routing.UrlHelper , який дозволяє побудувати URLs для контролерів API.
Приклад:
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 не існує ні у ваших поглядах, ні в стандартних контролерах.
ОНОВЛЕННЯ:
А для того, щоб робити маршрутизацію поза 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 викликається DefaultApi
у вашому методі RegisterRoutes у Global.asax
:
routes.MapHttpRoute(
name: "DefaultApi",
routeTemplate: "api/{controller}/{id}",
defaults: new { id = RouteParameter.Optional }
);
System.Web.Mvc.UrlHelper
для генерування маршрутів Api поза межами HttpControllerContext.
Він працює з більш простою формою, Url.Action
тому вам не доведеться посилатися на будь-які імена маршрутизації:
Url.Action("ActionName", "ControllerName", new { httproute = "DefaultApi" })
Ви можете додати ідентифікатор, area = ""
якщо потрібна URL-адреса в межах області. (Контролери Api за замовчуванням знаходяться за межами областей.) Я використовую MVC 4.
Url.Action
що використовується з перегляду. Url
типу System.Web.Mvc.UrlHelper
, і він не відображає WebApi
маршрути. Ось чому вам потрібен додатковий параметр: new { httproute = "" }
.
httproute""
але це не відображення = /
@Html.ActionLink("link", "Get", "Servers", new { id = r.idServer, area = "", httproute = "" }, null)
але це спрацювало чудово
Хочете мати можливість генерувати посилання на безпечний тип, без твердо кодованих рядків (назви контролерів)?
Для цього є обов'язок! (і це написав Марк Семан)
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
Ось метод KISS для відповіді на питання:
Якщо це код, який ви використовували б для створення URL-адреси контролера MVC
@Url.Action("Edit", "MyController")
Для отримання URL-адреси для версії API контролера (якщо ви використовуєте те саме ім’я контролера) ви можете використовувати
@Url.Action("Edit", "api/MyController")
Усі методи Url.Action - це додавання кореневого шляху програми з ім'ям контролера, а потім ім'ям дії (якщо тільки це "Index", в цьому випадку він не додається. Якщо об'єкт значень маршруту має ідентифікатор властивості, значення також додається до URL-адреси.
api/
раніше, ніж моє ім'я контролера.