c# - 本 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”。
另外我的第二个问题是用书籍替换 [控制器] 是如何工作的。就像这种语法的名称是什么?我什至不知道用什么谷歌来获取更多信息。
解决方案
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] 中的令牌替换
推荐阅读
- javascript - 我可以使用 Nodejs 制作网站跟踪器吗?
- mysql - MYSQL 存储过程 - 连续行值(续)
- python - 对 csv 文件返回的每对元组求和
- java - ResourceLocation 抛出 FileNotFoundException Minecraft Forge 1.12.2
- laravel - Laravel 政策总是返回 403 未授权
- python - 获取非托管 DLL 路径以独立于版本加载 Python
- jquery - jQuery 不断重置我的日期选择器字段
- javascript - 为什么全局变量值显示为未定义?
- javascript - jQuery平滑滚动并对齐到页面中间错误消息后的输入
- javascript - Canvacord.rank 不是函数