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

jQuery Ajax GET calling wrong method in Web API Core controller

我正在执行一个简单的 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 参数的方法。对正在发生的事情有什么想法吗?

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