Warning: file_get_contents(/data/phpspider/zhask/data//catemap/0/asp.net-core/3.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 我应该添加什么路径来映射到API控制器?_C#_Asp.net Core_Asp.net Core Mvc_Asp.net Core Webapi - Fatal编程技术网

C# 我应该添加什么路径来映射到API控制器?

C# 我应该添加什么路径来映射到API控制器?,c#,asp.net-core,asp.net-core-mvc,asp.net-core-webapi,C#,Asp.net Core,Asp.net Core Mvc,Asp.net Core Webapi,我已将ApiController添加到我的asp.net core 2.2应用程序中,来自UI的异步调用不匹配 以下是我在Startup.cs中的路线 app.UseMvc(config => { config.MapRoute( "Api", "api/{controller}/{action}/{id?}" ); config.MapRoute( "Default", "{controller=

我已将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函数之一

函数clearAllFilters(){ 美元({ url:“/api/GridFilter/ClearAllFilters”, contentType:“应用程序/json;字符集=utf-8”, 数据类型:“json”, 成功:函数(){ console.log(“过滤器已清除”); } }); } 以下是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与此不匹配?我的url是/api/controller/action,它似乎与启动中映射的第一个路由匹配

你是:

操作可以按常规路由,也可以按属性路由。在控制器或操作上放置路由将使其成为路由属性。定义属性路由的操作无法通过常规路由实现,反之亦然控制器上的任何路由属性将路由控制器属性中的所有操作

您的示例中的以下调用配置了常规路由模板:

但是,您已通过使用路由属性(
[Route(…)]
)将
GridFilterController
配置为使用属性路由:

要从
/api/GridFilter/ClearAllFilters
访问
ClearAllFilters
操作,您有两个常规选项:

  • 将属性路由模板更改为:

    [Route("api/[controller]/[action]")]
    
    这意味着操作的名称将包含在路由中,这与您设置的传统路由模板类似

  • 完全删除
    [Route(…)]
    属性。但是,这并不理想,因为您还必须删除
    [ApiController]
    属性


  • 谢谢我在微软的文档中搜索了又搜索,但不知怎么的,我没有注意到api控制器必须使用基于属性的路由的细节。我按照你的建议选择了选项1。现在效果很好。我在回答属性路由要求时添加了一个文档链接。
    [Route("api/[controller]")]
    [ApiController]
    public class GridFilterController : ControllerBase
    
    [Route("api/[controller]/[action]")]