Как создать URL веб-API ASP.NET? - PullRequest
115 голосов
/ 29 февраля 2012

В ASP.NET MVC у нас есть @Url.Action для действий. Есть ли что-то похожее на @Url.Api, которое будет направлять в / api / controller?

Ответы [ 4 ]

135 голосов
/ 29 февраля 2012

ApiController имеет свойство с именем Url типа System.Web.Http.Routing.UrlHelper , которое позволяет создавать URL-адреса для контроллеров 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 не существует ни в ваших представлениях, ни в стандартных контроллерах.


UPDATE:

А чтобы выполнить маршрутизацию вне 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 }
);
44 голосов
/ 25 июля 2013

Он работает с более простой формой Url.Action, поэтому вам не нужно ссылаться на имена маршрутизации:

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

Возможно, вы захотите добавить area = "", если URL необходим внутриПлощадь.(Контроллеры API по умолчанию находятся за пределами области.) Я использую MVC 4.

6 голосов
/ 16 ноября 2015

Хотите иметь возможность генерировать ссылки безопасным способом, без жестко закодированных строк (имен контроллеров)?

Для этого есть нюансы!(и написано Марком Симаном)

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
3 голосов
/ 04 октября 2017

Вот метод KISS для ответа на вопрос:

Если этот код используется для создания URL-адреса контроллера MVC

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

Чтобы получить URL-адрес для версии API контроллера (при условии, что вы используете то же имя контроллера), вы можете использовать

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

Все, что делает метод Url.Action, - это добавление корневого пути приложения с именем контроллера, за которым следует имя действия (если только это не «Index», в этом случае он не добавляется. Если объект значений маршрута имеет свойство id, значение также добавляется к URL.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...