如何获取Api Controller Uri进行getJSON调用?

时间:2015-05-27 12:27:21

标签: jquery ajax asp.net-mvc-4 asp.net-web-api asp.net-web-api-routing

我正在尝试获取用于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 }
        );
    }
}

3 个答案:

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

然而,它似乎真的很冗长和不必要。