WebApi控制器中的方法与适当的AJAX调用不匹配

时间:2015-10-27 13:23:32

标签: c# asp.net ajax asp.net-web-api

我的控制器代码:

    public List<ContactDTO> GetAllContacts()
    {
        return repository.GetAllContacts().ToList();
    }

    public ContactDTO GetContact(int contactId)
    {
        return repository.GetContact(contactId);
    }

我的ajax电话:

            $.ajax({
                method: "GET",
                url: "http://localhost:54185/contacts/details/1",
                dataType: "JSON",
                success: function (data) {
                    callback();
                },
            });

我的ajax调用让所有联系人正常工作:

            $.ajax({
                method: "GET",
                url: "http://localhost:54185/contacts",
                dataType: "JSON",
                success: function (result) {
                    // result is ok
                }
            });

我已编辑了RouteConfigWebApiConfig个文件,因此我不确定我是否做得对。

//RouteConfig:
public static void RegisterRoutes(RouteCollection routes)
        {
            routes.IgnoreRoute("{resource}.axd/{*pathInfo}");

            routes.MapRoute(
                name: "Default",
                url: "{controller}/{id}",
                defaults: new { controller = "Home", action = "Index", id = UrlParameter.Optional }
            );

            routes.MapRoute(
                name: "Details",
                url: "contacts/details/{id}",
                defaults: new { controller = "Home", action = "Details", id = UrlParameter.Optional }
            );
        }

和WebApiConfig

public static void Register(HttpConfiguration config)
        {
            config.Routes.MapHttpRoute(
                name: "DefaultApi",
                routeTemplate: "{controller}/{id}",
                defaults: new { id = RouteParameter.Optional }
            );

            config.Routes.MapHttpRoute(name: "contactDetails",
                routeTemplate: "{controller}/details/{id}");
        }

所以我不确定我错过了什么/做错了什么。使用此配置,首先ajax调用始终属于GetAllContacts()方法

2 个答案:

答案 0 :(得分:0)

在这种情况下,如果您同时使用MVC和API,则最好不要混淆您的路由方案。而且我不确定GetAllContacts在这种情况下是如何工作的,要么应用像之前的回答者所说的Route属性,要么重命名你的方法。

我更喜欢将API保存在特定的分类中:

config.Routes.MapHttpRoute(
                name: "DefaultApi",
                routeTemplate: "api/{controller}/{action}",
                defaults: new { 
                    controller = "DefaultApi", 
                    id = RouteParameter.Optional }
);

所以在你的情况下,保持你的控制器并保持你的行动。也许可以用[HttpGet]来装饰它以获得良好的衡量标准:

[HttpGet]
public List<ContactDTO> AllContacts()
{
    return repository.GetAllContacts().ToList();
}

如果您在.CSHTML文件中渲染脚本,您可以让Web API为您呈现正确的路径:

$.ajax({
    method: "GET",
    url: "@(Url.RouteUrl("DefaultApi", new { httproute = false, controller = "Contacts", action = "AllContacts" }))",
    dataType: "JSON",
    success: function (result) {
        // result is ok
    }
});

答案 1 :(得分:-2)

尝试使用Atribute Routing以更好地理解 你需要提供完整的