【问题标题】:Ajax call 404 error but my url is correct (ASP.NET MVC)Ajax 调用 404 错误,但我的 url 正确(ASP.NET MVC)
【发布时间】:2016-10-10 20:47:46
【问题描述】:

你好,我是新手程序员,刚接触到 asp.net mvc 和所有这些 js 东西。在我当前的 mvc 项目中,我有一个奇怪的错误,我只是不知道它为什么会发生。

对于控制器中的两个不同操作,我有两个几乎完全相同的 Ajax 调用。 GetPages 一个是成功的,另一个是给我一个 404。

///////////////////////////////////////////////////// ajax 调用//////////////////////////////////////// /////

//获取页面列表

GetPages = function (myCategory) {
        var url = config.base + "/api/CMS/GetPagesSorted";

        if (myCategory == null)
            return;

        $.ajax({
            url: url,
            type: "GET",
            dataType: "JSON",
            data: { categoryId: myCategory.Id },
            success: function (data) {
                // Clear pages and add new ones
                self.pageList.removeAll();
                self.pageList(data);
            }
        });
    };

//获取标签列表

    GetTabs = function (myPage) {
        var url = config.base + "/api/CMS/GetTabsSorted";

        if (myPage == null)
            return;

        $.ajax({
            url: url,
            type: "GET",
            dataType: "JSON",
            data: { pageId: myPage.Id },
            success: function (data) {
                // Clear tabs and add new ones
                self.tabList.removeAll();
                self.tabList(data);
            }
        });
    };

//////////////////////////////////////控制器正在调用的操作/////////////////////////////////////// //////

public IHttpActionResult GetPagesSorted(int categoryId)
    {

        var pages = dbCMS.CMS_Page.Where(x => x.Category.Id == categoryId).Select(x => new
        {
            Name = x.Name,
            OrderId = x.OrderId,
        });
        //sort the page order by OrderId
        pages = pages.OrderBy(x => x.OrderId);

        return Json(pages.ToList());
    }

public IHttpActionResult GetTabsSorted(int pageId)
    {

        var tabs = dbCMS.CMS_Tab.Where(x => x.Page.Id == pageId).Select(x => new
        {
            Name = x.Name,
            OrderId = x.OrderId,
        });
        //sort the page order by OrderId
        tabs = tabs.OrderBy(x => x.OrderId);

        return Json(tabs.ToList());
    }

GetPages 函数的 url 是: http://localhost:54522/api/CMS/GetPagesSorted

GetTabs 函数的 url 是: http://localhost:54522/api/CMS/GetTabsSorted

这些实际上只是复制和粘贴的功能,仅更改了控制器操作名称。我真的不认为路由是错误的,因为其中一个调用正在进入我希望它执行的控制器和操作。

我真的很沮丧发现这个错误请帮助!提前谢谢你们!

【问题讨论】:

  • var url = "/api/CMS/GetPagesSorted";删除 config.base 它将自动附加到 post
  • config.base 目前只给我一个空字符串。所以 url 就是 /api/CMS/GetPagesSorted。问题是 /api/CMS/GetPagesSorted 有效,但 /api/CMS/GetTabsSorted 给了我 404
  • 您可以在您的操作之前添加此数据注释[HttpGet]。如果可以的话,你也可以添加你的路由配置
  • 如果您只是在浏览器中导航到localhost:54522/api/CMS/GetTabsSorted会发生什么?
  • 通过直接在浏览器中导航到 url,它给了我这个“在控制器 'CMS' 上找不到与请求匹配的操作。”这只是 404

标签: c# jquery ajax asp.net-mvc http-status-code-404


【解决方案1】:

乍一看,错误告诉我们出了什么问题:

No action was found on the controller 'CMS' that matches the request

表示Web API路由模块没有找到给定pageId参数的GetTabsSorted,或者参数名称不匹配。

要解决可能的GET 方法冲突,请为每个操作定义MapHttpRoute,GetPagesSorted 和GetTabsSorted 类似于此方式:

// note parameter differences
config.Routes.MapHttpRoute(
    name: "PagesApi",
    routeTemplate: "api/{controller}/{action}/{categoryId}",
    defaults: new { categoryId = RouteParameter.Optional } // change this definition if you want categoryId becomes required
);

config.Routes.MapHttpRoute(
    name: "TabsApi",
    routeTemplate: "api/{controller}/{action}/{pageId}",
    defaults: new { pageId = RouteParameter.Optional } // change this definition if you want pageId becomes required
);

请记住,最具体的路由应该定义在默认路由或不太具体的路由之上。

参考:WebAPI No action was found on the controller

【讨论】:

    猜你喜欢
    • 2018-03-20
    • 2013-01-29
    • 2020-05-17
    • 1970-01-01
    • 1970-01-01
    • 2011-03-27
    • 1970-01-01
    • 1970-01-01
    • 2017-01-24
    相关资源
    最近更新 更多