如何获取 getJSON 调用的 Api 控制器 Uri?

How to get Api Controller Uri for getJSON calls?

我正在尝试为 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

是否有 'best practice' 用于将 link 处理到 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 }
        );
    }
}

编辑:见 post

末尾

您的控制器文件的位置无关紧要。基本上,要做到这一点,您必须编辑 App_Start/RoutConfig.cs 并添加新路由以告诉路由管理器什么 url 映射到哪个控制器。如果你只有一个 API 控制器,你可以这样做:

routes.MapRoute(
    name: "MyAPI",
    url: "api/MySweetApi/{action}",
    defaults: new { controller = "MySweetApi" }
);

如果你有多个,你可以这样做:

routes.MapRoute(
    name: "MyAPI",
    url: "api/{controller}/{action}",
    constraint: new { controller = "MySweetApi|MyOtherSweetApi|MyThirdAPI" }
);

如果您想了解有关路由及其可能性的更多信息,请查看 John Atten 的精彩 post:http://www.codeproject.com/Articles/641783/Customizing-Routes-in-ASP-NET-MVC

编辑:抱歉,我以为你问的是关于 mvc 路由的问题。

就我而言,我一直使用

@Url.Action("ControllerName", "ActionName")

它应该使用您的路由 table 来生成 URL,这样您的路由映射中的未来更改不应破坏您所有的 api url。

这个有效:

$.getJSON('@Url.HttpRouteUrl("DefaultApi", new RouteValueDictionary{ {"action","Get"}, {"controller", "MySweetApi"}})', null, function (data) {
    $.each(data, function(index, element) {
        elements.push(element.ReferenceNumber + " - " + element.Description);
    });
});

然而,这似乎真的很冗长而且没有必要。

您似乎在询问 WebAPI。由于 WebAPI 按照惯例不使用操作方法名称,因此您需要像这样调用方法:

var elements = [];
$.getJSON("api/MySweetApi/", null, function(data) {
    $.each(data, function(index, element) {
        elements.push(element.ReferenceNumber + " - " + element.Description);
    });
});

这应该return MySweetApi 控制器上的 Get 方法中的所有记录。