路由基础知识
当你通过浏览器请求 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/Index
和 yourSite
时获得相同结果的原因
你可能已经注意到我们有一个名为 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\Important
或 yourSiteName\Important\888
时,它将被发送到 HomeController 的 Index 操作。
路线定义登记顺序
路线登记的顺序很重要。你应该始终在通用默认路由之前注册特定的路由模式。