路由是将HTTP请求定向到控制器的过程,此处理的功能在System.Web.Routing中实现.此程序集不是ASP.NET MVC的一部分.它实际上是ASP.NET运行时的一部分,并且它作为.NET 3.5 SP1正式发布.
System.Web.Routing 由MVC框架使用,但它也被ASP.NET动态数据使用. MVC框架利用路由将请求定向到控制器. Global.asax文件是应用程序的一部分,您可以在其中定义应用程序的路径.
这是来自MVC App的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中选择参数并将它们作为参数传递给方法.
因此,在应用程序中定义的此路由是默认路由.如上面的代码所示,当你看到一个URL以(某事)/(某事)/(某事)的形式到达时,第一部分是控制器名称,第二部分是动作名称,第三部分是ID参数.
MVC应用程序使用ASP.NET路由系统,该系统决定URL如何映射到控制器和操作.
当Visual Studio创建MVC项目时,它会添加一些默认路由以启动我们.当您运行应用程序时,您将看到Visual Studio已将浏览器定向到端口63664.您几乎肯定会在浏览器请求的URL中看到不同的端口号,因为Visual Studio会在创建项目时分配随机端口
在上一个例子中,我们添加了一个HomeController,因此您也可以请求以下任何URL,它们将被定向到HomeController上的Index操作.
http://localhost:63664/Home/
http://localhost:63664/Home/Index
当浏览器请求http://mysite/或http://mysite/Home,它从HomeController的Index方法返回输出.
您也可以通过更改浏览器中的URL来尝试此操作.在此示例中,它是http://localhost:63664/,但端口可能不同.
如果您将/Home或/Home/Index附加到URL并按'输入'按钮,您将看到来自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 Controller.我们可以使操作稍微不同,默认操作,我们可以使其成为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的流程页 http://localhost:63664/Process
您将看到HTTP 404,因为路由引擎正在寻找不可用的ProcessController.
第2步 : 通过右键单击解决方案资源管理器中的Controllers文件夹创建ProcessController,然后选择Add → 控制器.
它将显示Add Scaffold对话框.
第3步 : 选择MVC 5 Controller - Empty选项并单击"Add"按钮.
将出现Add Controller对话框.
步骤4 : 将名称设置为ProcessController并单击"添加"按钮.
现在,您将在Controllers文件夹中看到一个新的C#文件ProcessController.cs,该文件在Visual Studio中也可以进行编辑.
现在我们的默认操作将是列表,所以我们希望在这里有一个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,http://localhost:63664/Process/List时,您将看到ProcessController的结果.