[asp.net-mvc-4] ASP.NET Web API Url을 만드는 방법은 무엇입니까?

ASP.NET MVC에는 @Url.Action작업이 있습니다. @Url.Api/ api / controller로 라우팅되는 것과 비슷한 것이 있습니까?



답변

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.Action하므로 라우팅 이름을 참조 할 필요가 없습니다.

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

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


답변

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

그것에 대한 너겟이 있습니다! (그리고 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


답변

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

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

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

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

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

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


답변