我正在尝试获取用于getJSON调用的API控制器的Url。我在堆栈上弹出的重复答案不起作用:
var elements = [];
$.getJSON("api/MySweetApi/Get", null, function(data) {
$.each(data, function(index, element) {
elements.push(element.ReferenceNumber + " - " + element.Description);
});
});
我的ApiController位于~/Controllers/api
。
是否存在处理MVC api控制器链接的“最佳实践”?在一个完美的世界中,答案会挂钩到路由引擎,这样如果我们决定将api控制器移动到~/api
,它就可以在我们不必进行任何更改的情况下工作。
我的WebApiConfig是:
public static class WebApiConfig
{
public static void Register(HttpConfiguration config)
{
// Web API configuration and services
// Web API routes
config.MapHttpAttributeRoutes();
config.Routes.MapHttpRoute(
name: "DefaultApi",
routeTemplate: "api/{controller}/{id}",
defaults: new { id = RouteParameter.Optional }
);
}
}
答案 0 :(得分:0)
编辑:请参阅帖子末尾
控制器文件的位置无关紧要。基本上,要做到这一点,您将需要编辑App_Start / RoutConfig.cs并添加新路由以告知路由管理器将哪个URL映射到哪个控制器。如果你有一个API控制器,你可以这样做:
routes.MapRoute(
name: "MyAPI",
url: "api/MySweetApi/{action}",
defaults: new { controller = "MySweetApi" }
);
如果你有多个onese,你可以这样做:
routes.MapRoute(
name: "MyAPI",
url: "api/{controller}/{action}",
constraint: new { controller = "MySweetApi|MyOtherSweetApi|MyThirdAPI" }
);
如果您想了解更多有关路线及其可能性的信息,请查看John Atten撰写的这篇精彩文章:http://www.codeproject.com/Articles/641783/Customizing-Routes-in-ASP-NET-MVC
编辑:对不起,我以为你在问mvc溃败。
就我而言,我一直使用
@Url.Action("ControllerName", "ActionName")
它应该使用您的路由表来生成URL,因此路线映射中的未来变化不应该打破您的所有答案。
答案 1 :(得分:0)
看起来你在询问WebAPI。由于WebAPI按照惯例不使用操作方法名称,因此您需要调用此方法:
var elements = [];
$.getJSON("api/MySweetApi/", null, function(data) {
$.each(data, function(index, element) {
elements.push(element.ReferenceNumber + " - " + element.Description);
});
});
这应该返回MySweetApi控制器上Get方法中的所有记录。
答案 2 :(得分:-1)
这有效:
$.getJSON('@Url.HttpRouteUrl("DefaultApi", new RouteValueDictionary{ {"action","Get"}, {"controller", "MySweetApi"}})', null, function (data) {
$.each(data, function(index, element) {
elements.push(element.ReferenceNumber + " - " + element.Description);
});
});
然而,它似乎真的很冗长和不必要。