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应用程序(FirstMVCApp)中的Global.asax中的应用程序启动事件的代码。

using System;
using System.Collections.Generic;
using System.Linq;
using System.Web;
using System.Web.Mvc;
using System.Web.Routing;

namespace FirstMVCApp
{
    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 FirstMVCApp {
   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以(something)/(something)/(something)的形式到达的时候,第一个是控制器的名称,第二个是动作的名字,第三个是一个ID参数。

理解路由

MVC应用程序使用ASP.NET路由系统,它决定URL如何映射到控制器和操作。

当Visual Studio创建MVC项目时,它会添加一些默认路由来启动。 运行应用程序时,您将看到Visual Studio已将浏览器定向到端口56922。几乎可以肯定地每次在浏览器请求的URL中看到不同的端口号,因为Visual Studio在创建项目时会分配一个随机端口。

在最后一个例子中,我们添加了一个控制器:HomeController ,所以也可以请求任何下面的URL,它们将被定向到HomeController上的Index 操作。如下都是有效的URL -

http://localhost:56922/Home/
-- 或者 --
http://localhost:56922/Home/Index

当浏览器请求 http://mysite/http://mysite/Home 时,它会从HomeControllerIndex方法获取输出。

也可以通过更改浏览器中的URL来尝试此操作。在这个例子中,它是http://localhost:56922/,除了端口可能不同。

如果将/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作为的默认行为。

以下是完整的类实现。创建一个名称为:MyRouteConfig 的类,参考代码 -

using System;
using System.Collections.Generic;
using System.Linq;
using System.Web;
using System.Web.Routing;
using System.Web;
using System.Web.Mvc;
using System.Web.Routing;

namespace FirstMVCApp
{

    public class MyRouteConfig
    {
        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: "Home", 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,然后选择:添加 -> 控制器

它将显示“添加基架” 对话框。如下图所示 -

第3步 - 选择MVC 5控制器 - 空选项,然后单击“添加” 按钮。添加控制器对话框将出现。

第4步 - 将名称设置为ProcessController,然后单击“添加” 按钮。如下图所示 -

现在,将在Controllers文件夹中看到一个新的 C# 文件:ProcessController.cs,在Visual Studio中打开并进行编辑。如下图所示 -

第5步 - 将返回类型从ActionResult更改为String,并使用以下代码从此操作方法返回一些字符串。修改后的 ProcessController 文件中的代码如下 -

using System;
using System.Collections.Generic;
using System.Linq;
using System.Web;
using System.Web.Mvc;

namespace FirstMVCApp.Controllers
{
    public class ProcessController : Controller
    {
        // GET: Process
        public String Index()
        {
            return "ProcessController.Index() Page.";
        }

        // GET: Process
        public String List()
        {
            return "ProcessController.List() Page.";
        }
    }
}

第6步 - 当运行这个应用程序,会看到默认路由的结果。当指定以下URL( http://localhost:56922/Process/List )时,您将看到ProcessController的结果。


上一篇: ASP.Net MVC生命周期 下一篇: ASP.Net MVC控制器