我需要添加什么路由来映射到 API 控制器?

我已将 ApiController 添加到我的 asp.net core 2.2 应用程序中,并且来自 UI 的异步调用不匹配。


这是我在 Startup.cs 中的路线。


app.UseMvc(config =>

{

    config.MapRoute(

        "Api",

        "api/{controller}/{action}/{id?}"

    );


    config.MapRoute(

        "Default", 

        "{controller=App}/{action=Index}/{id?}"

    );

});

下面是向 API 控制器发出各种 GET 请求的 JavaScript 函数之一。


function clearAllFilters() {

  $.get({

    url: "/api/GridFilter/ClearAllFilters",

    contentType: "application/json; charset=utf-8",

    dataType: "json",

    success: function () {

        console.log('filters cleared');

    }

  });

}

这是 API 控制器:


[Route("api/[controller]")]

[ApiController]

public class GridFilterController : ControllerBase

{

    private static readonly string[] FilterFields = {

        // Bunch of strings, omitted for brevity

    };


    [HttpGet]

    public IActionResult ClearAllFilters()

    {

        foreach (string column in FilterFields)

        {

            if (HttpContext.Session.TryGetValue(column, out byte[] savedJson))

            {

                HttpContext.Session.Remove(column);

            }

        }

        return Ok(true);

    }

为什么asp.net不匹配这个?我的网址是 /api/controller/action ,它似乎与启动时映射的第一个路由匹配。


SMILET
浏览 81回答 1
1回答

长风秋雁

您正在混合传统路由和属性路由:操作要么是传统路由,要么是属性路由。将路由放置在控制器或操作上使其具有路由属性。定义属性路由的操作无法通过常规路由到达,反之亦然。控制器上的任何路由属性都会使控制器属性中的所有操作都路由。示例中的以下调用配置传统路由模板:config.MapRoute("Api","api/{controller}/{action}/{id?}");但是,您已GridFilterController通过使用路由属性 ( [Route(...)]) 配置为使用属性路由:[Route("api/[controller]")] [ApiController] public class GridFilterController : ControllerBase要从访问ClearAllFilters操作/api/GridFilter/ClearAllFilters,您有两个常规选项:将属性路由模板更改为:[Route("api/[controller]/[action]")]这意味着操作的名称将作为路由的一部分包含在内,这与您设置的传统路由模板类似。完全删除该[Route(...)]属性。但是,这并不理想,因为您还必须删除该[ApiController]属性,因为这需要属性路由。
打开App,查看更多内容
随时随地看视频慕课网APP