- ASP.NET MVC 教程
- ASP.NET MVC - 首页
- ASP.NET MVC - 概述
- ASP.NET MVC - 模式
- ASP.NET MVC - 环境设置
- ASP.NET MVC - 入门
- ASP.NET MVC - 生命周期
- ASP.NET MVC - 路由
- ASP.NET MVC - 控制器
- ASP.NET MVC - 动作
- ASP.NET MVC - 过滤器
- ASP.NET MVC - 选择器
- ASP.NET MVC - 视图
- ASP.NET MVC - 数据模型
- ASP.NET MVC - 辅助程序
- ASP.NET MVC - 模型绑定
- ASP.NET MVC - 数据库
- ASP.NET MVC - 验证
- ASP.NET MVC - 安全性
- ASP.NET MVC - 缓存
- ASP.NET MVC - Razor
- ASP.NET MVC - 数据注释
- Nuget 包管理
- ASP.NET MVC - Web API
- ASP.NET MVC - 脚手架
- ASP.NET MVC - Bootstrap
- ASP.NET MVC - 单元测试
- ASP.NET MVC - 部署
- ASP.NET MVC - 自托管
- ASP.NET MVC 有用资源
- ASP.NET MVC - 快速指南
- ASP.NET MVC - 有用资源
- ASP.NET MVC - 讨论
ASP.NET MVC - 路由
路由是将 HTTP 请求定向到控制器的过程,此处理功能在 System.Web.Routing 中实现。此程序集不是 ASP.NET MVC 的一部分。它实际上是 ASP.NET 运行时的一部分,并随 ASP.NET .NET 3.5 SP1 正式发布。
MVC 框架使用System.Web.Routing,但 ASP.NET 动态数据也使用它。MVC 框架利用路由将请求定向到控制器。Global.asax 文件是应用程序的一部分,您将在其中定义应用程序的路由。
这是我们上一章中创建的 MVC 应用程序中 Global.asax 中应用程序启动事件的代码。
using System; using System.Collections.Generic; using System.Linq; using System.Web; using System.Web.Mvc; using System.Web.Routing; namespace MVCFirstApp { public class MvcApplication : System.Web.HttpApplication { protected void Application_Start(){ AreaRegistration.RegisterAllAreas(); RouteConfig.RegisterRoutes(RouteTable.Routes); } } }
以下是 RouteConfig 类的实现,其中包含一个方法 RegisterRoutes。
using System; using System.Collections.Generic; using System.Linq; using System.Web; using System.Web.Mvc; using System.Web.Routing; namespace MVCFirstApp { public class RouteConfig { public static void RegisterRoutes(RouteCollection routes){ routes.IgnoreRoute("{resource}.axd/{*pathInfo}"); routes.MapRoute( name: "Default", url: "{controller}/{action}/{id}", defaults: new{ controller = "Home", action = "Index", id = UrlParameter.Optional}); } } }
您将定义路由,这些路由将 URL 映射到特定的控制器操作。操作只是控制器上的一个方法。它还可以从该 URL 中提取参数并将它们作为参数传递到方法中。
因此,在应用程序中定义的此路由是默认路由。如上述代码所示,当您看到以 (something)/(something)/(something) 形式到达的 URL 时,第一部分是控制器名称,第二部分是操作名称,第三部分是 ID 参数。
理解路由
MVC 应用程序使用 ASP.NET 路由系统,该系统决定 URL 如何映射到控制器和操作。
当 Visual Studio 创建 MVC 项目时,它会添加一些默认路由以帮助我们入门。运行应用程序时,您会看到 Visual Studio 已将浏览器定向到端口 63664。您几乎肯定会看到浏览器请求的 URL 中不同的端口号,因为 Visual Studio 在创建项目时会分配随机端口。
在最后一个示例中,我们添加了一个 HomeController,因此您也可以请求以下任何 URL,它们将被定向到 HomeController 上的 Index 操作。
https://127.0.0.1:63664/Home/
https://127.0.0.1:63664/Home/Index
当浏览器请求 http://mysite/ 或 http://mysite/Home 时,它会返回 HomeController 的 Index 方法的输出。
您也可以尝试通过更改浏览器中的 URL 来实现此目的。在此示例中,它是 https://127.0.0.1:63664/,只是端口可能不同。
如果将 /Home 或 /Home/Index 附加到 URL 并按“Enter”按钮,您将看到 MVC 应用程序的相同结果。
正如您在此例中看到的,约定是我们有一个名为 HomeController 的控制器,此 HomeController 将成为我们 MVC 应用程序的起点。
Visual Studio 为新项目创建的默认路由假定您将遵循此约定。但是,如果您想遵循自己的约定,则需要修改路由。
自定义约定
您当然可以添加自己的路由。如果您不喜欢这些操作名称,如果您有不同的 ID 参数,或者如果您通常对站点的 URL 结构不同,则可以添加自己的路由条目。
让我们来看一个简单的例子。假设我们有一个包含进程列表的页面。以下是将路由到该进程页面的代码。
routes.MapRoute( "Process", "Process/{action}/{id}", defaults: new{ controller = "Process", action = "List ", id = UrlParameter.Optional} );
当有人进入并查找带有 Process/Action/Id 的 URL 时,他们将转到 Process 控制器。我们可以使操作略有不同,默认操作,我们可以将其设为 List 而不是 Index。
现在到达的请求看起来像 localhosts/process。路由引擎将使用此路由配置将其传递,因此它将使用 List 的默认操作。
以下是完整的类实现。
using System; using System.Collections.Generic; using System.Linq; using System.Web; using System.Web.Mvc; using System.Web.Routing; namespace MVCFirstApp{ public class RouteConfig{ public static void RegisterRoutes(RouteCollection routes){ routes.IgnoreRoute("{resource}.axd/{*pathInfo}"); routes.MapRoute( "Process", "Process/{action}/{id}", defaults: new{ controller = " Process", action = "List ", id = UrlParameter.Optional}); routes.MapRoute( name: "Default", url: "{controller}/{action}/{id}", defaults: new{ controller = "Home", action = "Index", id = UrlParameter.Optional}); } } }
步骤 1 - 运行此程序并使用以下 URL 请求进程页面 https://127.0.0.1:63664/Process
您将看到 HTTP 404,因为路由引擎正在查找 ProcessController,而该控制器不可用。
步骤 2 - 通过右键单击解决方案资源管理器中的 Controllers 文件夹并选择添加 → 控制器来创建 ProcessController。
它将显示“添加脚手架”对话框。
步骤 3 - 选择 MVC 5 控制器 - 空选项,然后单击“添加”按钮。
将出现“添加控制器”对话框。
步骤 4 - 将名称设置为 ProcessController 并单击“添加”按钮。
现在,您将在 Controllers 文件夹中看到一个新的 C# 文件 ProcessController.cs,该文件也将在 Visual Studio 中打开以进行编辑。
现在我们的默认操作将是 List,因此我们希望在此处使用 List 操作而不是 Index。
步骤 5 - 将返回类型从 ActionResult 更改为 string,并使用以下代码从此操作方法返回一些字符串。
using System; using System.Collections.Generic; using System.Linq; using System.Web; using System.Web.Mvc; namespace MVCFirstApp.Controllers{ public class ProcessController : Controller{ // GET: Process public string List(){ return "This is Process page"; } } }
步骤 6 - 当您运行此应用程序时,您将再次看到默认路由的结果。当您指定以下 URL 时,https://127.0.0.1:63664/Process/List,然后您将看到 ProcessController 的结果。