ASP.NET Web API Url을 만드는 방법은 무엇입니까?


답변:


139

ApiController는 라는 속성이 URL 형식입니다 System.Web.Http.Routing.UrlHelper 당신이 API를 컨트롤러의 URL을 구성 할 수 있습니다.

예:

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 }
);

그것은 .. 안전한 방법으로 URL을 생성 할 수있는 뷰가 필요하기 때문에 정말 저에게 큰 도움이되지 않습니다. Go Live 라이선스가있는 경우 View에 URL을 생성하는 'Go Live'방법은 무엇입니까?
Shane Courtrille 2012

더 중요한 것은 ASP.Net Development Server를 사용하는 경우 항상 포트를 변경하므로보기에서 URL을 하드 코어 할 수 없기 때문에 작동하지 않습니다.
Shane Courtrille 2012

@ShaneCourtrille, System.Web.Mvc.UrlHelperHttpControllerContext 외부에서 Api 경로를 생성 하기 위해 노멀 을 사용하는 방법을 설명하기 위해 내 답변을 업데이트했습니다 .
Darin Dimitrov

매우 감사합니다! RouteUrl을 사용하려고했지만 httproute 매개 변수 요구 사항에 대해 몰랐습니다.
Shane Courtrille

2
샘플의 목적을 이해합니다. 이 값이 임의의 코드를 실행하는 것이 아니라 가능한 시나리오에서 얻으려고 한 값 임을 보여주기 때문에 ViewBag 코드 한 줄에 던지면 더 유용한 샘플이 될 것이라고 말하고 있습니다 . 다시 말하지만, 특정 코드 라인이 관련 코드라는 것을 마침내 인식하기 전에 내가 놓친 것을 깨닫지 못하고 몇 분을 낭비하지 않았다면 언급하지 않았을 것입니다.
Jon Davis

43

더 간단한 형식으로 작동 Url.Action하므로 라우팅 이름을 참조 할 필요가 없습니다.

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

area = ""영역 내에서 URL이 필요한 경우 를 추가 할 수 있습니다 . (Api 컨트롤러는 기본적으로 영역 외부에 있습니다.) 저는 MVC 4를 사용하고 있습니다.


7
Web Api의 UrlHelper는 msdn.microsoft.com/en-us/library/… 이며 작업 방법이 없습니다.
Yuriy Faktorovich

8
@YuriyFaktorovich이 게시물 Url.Action은 View에서 사용되고 있음을 의미합니다 . Url은 유형 System.Web.Mvc.UrlHelper이며 WebApi경로에 매핑되지 않습니다 . 이것이 추가 매개 변수가 필요한 이유입니다 : new { httproute = "" }.
Jesse

3
내가 추가 httproute""했지만 매핑되지 않습니다 = /
Maslow

나는 빈 영역으로 링크를 추가했고 널 htmlAttributes @Html.ActionLink("link", "Get", "Servers", new { id = r.idServer, area = "", httproute = "" }, null) 하지만이 완벽하게 작동
크리스토퍼 G. 루이스

2
이것은 뷰에서 완벽하게 작동하지만 / api / dashboard? action = getdata와 같은 쿼리 문자열로 작업 이름을 생성하는 이유를 모르겠습니다. 나는이 기다리고 있었다 : / API / 대시 보드 / GetData의
umutesen

7

하드 코딩 된 문자열 (컨트롤러 이름)없이 형식이 안전한 방식으로 링크를 생성 할 수 있기를 원하십니까?

그것에 대한 너겟이 있습니다! (그리고 Mark Seeman이 작성했습니다)

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

질문에 답하는 KISS 방법은 다음과 같습니다.

이것이 MVC 컨트롤러 URL을 만드는 데 사용할 코드 인 경우

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

컨트롤러의 API 버전에 대한 URL을 얻으려면 (동일한 컨트롤러 이름을 사용한다고 가정) 다음을 사용할 수 있습니다.

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

Url.Action 메서드가 수행하는 모든 작업은 컨트롤러 이름과 함께 응용 프로그램의 루트 경로를 추가하고 그 뒤에 작업 이름을 추가하는 것입니다 (추가되지 않는 "Index"가 아닌 경우. 경로 값 개체에 ID가있는 경우) 속성 값도 URL에 추가됩니다.


감사합니다! api/내 컨트롤러 이름 이 누락되었습니다 .
다니엘 Congrove
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.