代码之家  ›  专栏  ›  技术社区  ›  g_b

Web-API核心控制器中jQuery-Ajax GET调用错误方法

  •  2
  • g_b  · 技术社区  · 6 年前

    我正在做一个简单的get调用,但是我似乎无法在我的Web API控制器中得到正确的get方法来触发。我的路线如下:

    app.UseMvc(routes =>
    {
        routes.MapRoute(
            name: "default",
            template: "{controller=Home}/{action=Index}/{id?}");
    
        // I already tried removing this, same result
        routes.MapSpaFallbackRoute("spa-fallback", 
            new { controller = "Home", action = "Index" });
    });
    

    以及包含GET方法的控制器(按顺序):

    [Route("api/[controller]")]
    [ApiController]
    public class SchoolYearsController : ControllerBase
    {
        [HttpGet("~/api/terms/{termId:int}")]
        public IActionResult GetTermById(int termId)
        {
            // omitted for brevity
        }
    
        [HttpGet("~/api/terms")]
        public IActionResult GetAllTerms()
        {
            // omitted for brevity
        }
    }
    

    我的ajax调用:

    loadTerm() {
        $.ajax({
            url: "/api/terms?termid=3",
            method: "GET",
            contentType: "application/json; charset=utf-8"
        })
        .done((response, textStatus, xhr) => {
            // omitted for brevity
        })
        .fail((xhr, textStatus, errorThrown) => {
            console.log(errorThrown);
        });
    }
    

    我想这些是相关的章节。出于某种原因,它总是调用第二个方法(“~/api/terms”),而不是使用termId参数的方法。有什么想法吗?

    1 回复  |  直到 6 年前
        1
  •  4
  •   Nkosi    6 年前

    路线模板 GetTermById 行动需要 termId 在路由中不在查询字符串中。

    注意代码中的注释。

    //GET /api/terms/3
    [HttpGet("~/api/terms/{termId:int}")]
    public IActionResult GetTermById(int termId) {
        // omitted for brevity
    }
    

    因此,这意味着如果请求的URL与预期的路由模板不匹配,它将不会调用该操作。这个 GetAllTerms 预期行动 /api/terms ,它与客户端正在进行的调用相匹配,甚至与查询字符串相匹配,因为在本例中映射操作时,路由模板没有考虑查询字符串。

    更新客户端调用

     url: "/api/terms/3",
    

    参考 Routing to controller actions in ASP.NET Core

    推荐文章