- ASP.NET Core 教程
- ASP.NET Core - 首页
- ASP.NET Core - 概述
- ASP.NET Core - 环境设置
- ASP.NET Core - 新建项目
- ASP.NET Core - 项目布局
- ASP.NET Core - project.json
- ASP.NET Core - 配置
- ASP.NET Core - 中间件
- ASP.NET Core - 异常处理
- ASP.NET Core - 静态文件
- ASP.NET Core - 设置 MVC
- ASP.NET Core - MVC 设计模式
- ASP.NET Core - 路由
- ASP.NET Core - 属性路由
- ASP.NET Core - 操作结果
- ASP.NET Core - 视图
- 设置 Entity Framework
- ASP.NET Core - DbContext
- ASP.NET Core - Razor 布局视图
- ASP.NET Core - Razor 视图启动
- ASP.NET Core - Razor 视图导入
- ASP.NET Core - Razor 标签助手
- ASP.NET Core - Razor 编辑表单
- ASP.NET Core - 身份验证概述
- ASP.NET Core - Authorize 属性
- 身份验证配置
- ASP.NET Core - 身份迁移
- ASP.NET Core - 用户注册
- ASP.NET Core - 创建用户
- ASP.NET Core - 登录和注销
- ASP.NET Core 有用资源
- ASP.NET Core - 快速指南
- ASP.NET Core - 有用资源
- ASP.NET Core - 讨论
ASP.NET Core - 属性路由
本章我们将学习另一种路由方法:基于属性的路由。使用基于属性的路由,我们可以在控制器类及其内部方法上使用 C# 属性。这些属性包含元数据,告诉 ASP.NET Core 何时调用特定控制器。
它是基于约定的路由的替代方案。
路由的评估顺序与其出现的顺序(即注册顺序)相同,但是映射多个路由非常常见,特别是当您希望在 URL 中使用不同的参数或不同的文字时。
示例
让我们来看一个简单的例子。打开 **FirstAppDemo** 项目并在浏览器中运行应用程序。当您指定 **/about** 时,它将产生以下输出:
我们想要的是,当我们指定 **/about** 时,应用程序应该调用 AboutController 的 Phone 操作。在这里,我们可以使用 Route 属性为该控制器强制执行一些显式路由。此属性位于 **Microsoft.AspNet.Mvc** 命名空间中。
以下是添加了属性路由的 **AboutController** 的实现。
using Microsoft.AspNet.Mvc; using System; using System.Collections.Generic; using System.Linq; using System.Threading.Tasks; namespace FirstAppDemo.Controllers { [Route("about")] public class AboutController { [Route ("")] public string Phone() { return "+49-333-3333333"; } [Route("country")] public string Country() { return "Germany"; } } }
我们希望此路由看起来像 about,对于 Phone 操作,我们指定了一个空字符串,这意味着我们不需要指定操作来获取此方法。用户只需要访问 /about 即可。对于 Country 操作,我们在路由属性中指定了“country”。让我们保存 AboutController,刷新浏览器并访问 /about,它应该会调用 Phone 操作。
让我们指定 **/about/country**。这将允许您访问 Country 操作。
如果您希望 URL 的一部分包含控制器的名称,您可以做的就是,不是显式使用控制器名称,而是在方括号中使用令牌 controller。这告诉 ASP.NET MVC 在此位置使用此控制器的名称,如下面的程序所示。
using Microsoft.AspNet.Mvc; using System; using System.Collections.Generic; using System.Linq; using System.Threading.Tasks; namespace FirstAppDemo.Controllers { [Route("[controller]")] public class AboutController { [Route ("")] public string Phone() { return "+49-333-3333333"; } [Route("[action]")] public string Country() { return "Germany"; } } }
这样,如果您重命名控制器,您就不必记住更改路由。操作也是如此,控制器和操作之间隐含有一个斜杠 (/)。控制器和操作之间存在层次关系,就像 URL 中一样。让我们再次保存此控制器。大多数情况下,您将看到相同的结果。
让我们指定 /about/country。这将允许您访问 Country 操作。