首页 > 解决方案 > 本 ASP.NET 教程中如何传递控制器的名称?

问题描述

我一直在关注这个ASP.NET 教程。在控制器的开头,有以下代码:

[Route("api/[controller]")]
[ApiController]
public class BooksController : ControllerBase

据我了解, ApiController 属性将此类声明为控制器,而 Route 属性声明了控制器中所有其他路由的基本路由。

当您向下滚动时,他们会使用http://localhost:<port>/api/books. 所以这意味着[控制器] 等于书籍。我找不到这个“书”作为控制器名称传入的位置。

传入一些字符串“books”的唯一时间是在 appsettings.json 文件中,这意味着 MongoDB 中的集合名称。字符串也是“Books”而不是“books”。

另外我的第二个问题是用书籍替换 [控制器] 是如何工作的。就像这种语法的名称是什么?我什至不知道用什么谷歌来获取更多信息。

标签: c#asp.net-coreasp.net-core-webapi

解决方案


RouteCollection实际上提供路由信息的集合以供控制器操作使用它们。当RouteTable被注册并且我们RouteTable的路由集合为RouteCollection. 当请求进来时,它会匹配这些记录中的模式RouteTable,如果找到路由记录,那么请求会转到相关的控制器操作,否则会出现 404 错误。

在此处输入图像描述

但是不要太认真,RouteTable它实际上并不存在,但它在逻辑上就像一张桌子一样工作。所以每个路由映射的名称属性应该是唯一的。

URL 路径/api/books,并将{ controller = Books, action = Index }通过标记路径来提取路由值。MVC 将尝试找到一个BooksController自动命名的控制器并运行操作详细信息。

下表演示了示例路由模板及其行为: 在此处输入图像描述

另外我的第二个问题是用书籍替换 [控制器] 是如何工作的。就像这种语法的名称是什么?我什至不知道用什么谷歌来获取更多信息。

属性路由的 [controller] 和 [action] 标记

通过[controller]在属性路由中使用标记,您可以确保路由中的控制器名称与控制器类的名称保持同步。

[Route("api/[controller]")] //     http://localhost:<port>/api/books
[ApiController]
public class BooksController : ControllerBase


[Route("api/[controller]")] //     http://localhost:<port>/api/hello
[ApiController]
public class HelloController : ControllerBase

如果使用[Route("api/books")],重命名控制器或操作名称不需要更改路由模板。

[Route("api/[books]")] //     http://localhost:<port>/api/books
[ApiController]
public class BooksController : ControllerBase

[Route("api/books")]  //          http://localhost:<port>/api/books still works
[ApiController]
public class HelloController : ControllerBase

学习相关链接

@mason 提供的ASP.NET Core中的路由 @John 提供的
路由模板 [controller]、[action]、[area] 中的令牌替换


推荐阅读