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(); }
现在,使用这种方法在VisualStudio中设置断点。运行项目并yourSite/Home/Index/999在浏览器中访问。断点将被击中,您应该可以看到参数999中现在提供了值999id。
创建第二个路线模式
假设我们要进行设置,以便针对不同的路线模式调用相同的操作方法。我们可以通过在路由表中添加新的路由定义来做到这一点。
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操作。
路径定义注册的顺序
路由注册的顺序很重要。您应该始终在通用默认路由之前注册特定的路由模式。