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
поэтому вам не нужно ссылаться на какие-либо имена маршрутизации:Вы можете добавить,
area = ""
если URL-адрес требуется в пределах области. (Контроллеры Api по умолчанию находятся за пределами областей.) Я использую MVC 4.источник
Url.Action
что используется из View.Url
относится к типуSystem.Web.Mvc.UrlHelper
и не соответствуетWebApi
маршрутам. Вот почему вам нужен дополнительный параметр:new { httproute = "" }
.httproute""
но это не отображение = /@Html.ActionLink("link", "Get", "Servers", new { id = r.idServer, area = "", httproute = "" }, null)
но это сработало отличноХотите иметь возможность генерировать ссылки безопасным способом, без жестко заданных строк (имен контроллеров)?
Для этого есть nuget! (и это написано Марком Симаном)
https://github.com/ploeh/Hyprlinkr
Работает так:
Маршруты, как обычно:
Получите URL:
Результат:
источник
Вот метод KISS для ответа на вопрос:
Если это код, который вы использовали бы для создания URL-адреса контроллера MVC
Чтобы получить URL-адрес версии API контроллера (при условии, что вы используете то же имя контроллера), вы можете использовать
Все, что делает метод Url.Action, - это добавление корневого пути приложения с именем контроллера, за которым следует имя действия (если это не «Индекс», и в этом случае он не добавляется. Если объект значений маршрута имеет идентификатор свойство значение также добавляется к URL-адресу.
источник
api/
перед моим контроллером.