asp.net-mvc 路由基础

示例

当您yourSite/Home/Index通过浏览器请求url时,路由模块会将请求定向到class的Indexaction方法HomeController。如何知道将请求发送到此特定类的特定方法?出现了RouteTable。

每个应用程序都有一个路由表,在其中存储路由模式和有关将请求定向到何处的信息。因此,当您创建mvc应用程序时,已经在路由表中注册了默认路由。您可以在RouteConfig.cs课堂上看到这一点。

public static void RegisterRoutes(RouteCollection routes)
{
   routes.IgnoreRoute("{resource}.axd/{*pathInfo}");
   routes.MapRoute("Default", "{controller}/{action}/{id}",
             new { controller = "Home", action = "Index", id =UrlParameter.Optional});
}

您可以看到该条目具有名称和模板。模板是当请求进入时要检查的路由模式。默认模板具有Home作为控制器URL段Index的值和作为操作段的值。这意味着,如果您没有在请求中显式传递控制器名称和操作,它将使用这些默认值。这就是为什么您访问yourSite/Home/Index和获得相同结果的原因yourSite

您可能已经注意到,我们有一个名为id的参数作为路由模式的最后一段。但是在默认值中,我们指定它是可选的。这就是我们不必在尝试输入的url中指定id值的原因。

现在,回到HomeController中的Index操作方法,并向其中添加一个参数

public ActionResult Index(int id)
{
     return View();
}

现在,使用这种方法在Visual Studio中设置断点。运行项目并yourSite/Home/Index/999在浏览器中访问。断点将被击中,您应该可以看到参数999中现在提供了值999 id。

创建第二个路线模式

假设我们要进行设置,以便针对不同的路线模式调用相同的操作方法。我们可以通过在路由表中添加新的路由定义来做到这一点。

public static void RegisterRoutes(RouteCollection routes)
{
   routes.IgnoreRoute("{resource}.axd/{*pathInfo}");
   
   // 添加了新的自定义路线定义
   routes.MapRoute("MySpecificRoute",
    "Important/{id}",
    new { controller = "Home", action = "Index", id =UrlParameter.Optional});

   //默认捕获所有普通路由定义
   routes.MapRoute("Default", "{controller}/{action}/{id}",
             new { controller = "Home", action = "Index", id =UrlParameter.Optional});
}

我添加的新定义具有一个模式Important/{id},其中id也是可选的。这意味着当您请求yourSiteName\Important或时yourSiteName\Important\888,它将被发送到HomeController的Index操作。

路径定义注册的顺序

路由注册的顺序很重要。您应该始终在通用默认路由之前注册特定的路由模式。