ASP.NET MVC - 路由

路由是将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会在创建项目时分配随机端口 Localhost Home

在上一个例子中,我们添加了一个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应用程序的相同结果.

Localhost Home Index

正如您在本案中所看到的那样,惯例是我们有一个名为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

Localhost Process

您将看到HTTP 404,因为路由引擎正在寻找不可用的ProcessController.

第2步 : 通过右键单击解决方案资源管理器中的Controllers文件夹创建ProcessController,然后选择Add → 控制器.

创建ProcessController

它将显示Add Scaffold对话框.

ProcessController Scaffolding Dialog

第3步 : 选择MVC 5 Controller  -  Empty选项并单击"Add"按钮.

将出现Add Controller对话框.

空选项添加按钮

步骤4 : 将名称设置为ProcessController并单击"添加"按钮.

现在,您将在Controllers文件夹中看到一个新的C#文件ProcessController.cs,该文件在Visual Studio中也可以进行编辑.

Set ProcessController

现在我们的默认操作将是列表,所以我们希望在这里有一个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的结果.

Localhost Process List