路由基础知识

当你通过浏览器请求 url yourSite/Home/Index 时,路由模块会将请求定向到 HomeController 类的 Index 操作方法。如何将请求发送到此特定类的特定方法?有路由表。

每个应用程序都有一个路由表,用于存储路由模式以及有关将请求定向到何处的信息。因此,在创建 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/IndexyourSite 时获得相同结果的原因

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

现在,返回 HomeController 中的 Index 操作方法并为其添加参数

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

现在在这个方法中放置一个 visual studio 断点 。运行你的项目并在浏览器中访问 yourSite/Home/Index/999。断点将被击中,你应该能够看到 id 参数中现在可以使用值 999。

创建第二个 Route 模式

假设我们想要设置它,以便为不同的路由模式调用相同的操作方法。我们可以通过向路由表添加新的路由定义来实现。

public static void RegisterRoutes(RouteCollection routes)
{
   routes.IgnoreRoute("{resource}.axd/{*pathInfo}");
   
   // New custom route definition added
   routes.MapRoute("MySpecificRoute",
    "Important/{id}",
    new { controller = "Home", action = "Index", id = UrlParameter.Optional });

   //Default catch all normal route definition
   routes.MapRoute("Default", "{controller}/{action}/{id}",
             new { controller = "Home", action = "Index", id = UrlParameter.Optional });
}

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

路线定义登记顺序

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