답변:
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 }
);
System.Web.Mvc.UrlHelper
HttpControllerContext 외부에서 Api 경로를 생성 하기 위해 노멀 을 사용하는 방법을 설명하기 위해 내 답변을 업데이트했습니다 .
더 간단한 형식으로 작동 Url.Action
하므로 라우팅 이름을 참조 할 필요가 없습니다.
Url.Action("ActionName", "ControllerName", new { httproute = "DefaultApi" })
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)
하지만이 완벽하게 작동
하드 코딩 된 문자열 (컨트롤러 이름)없이 형식이 안전한 방식으로 링크를 생성 할 수 있기를 원하십니까?
그것에 대한 너겟이 있습니다! (그리고 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에 추가됩니다.
api/
내 컨트롤러 이름 이 누락되었습니다 .