在学习MVC的过程中,记录一些基础但很必要的东西。
学习MVC很多同学都喜欢使用默认的路由配置,而不关心怎么去利用它实现一些复杂的或者自定义的配置,下面结合MSDN一起学习一下
1.MVC路由有什么用处?
答:路由被用于匹配有客户端发送过来的HTTP请求,返回适当的网址给浏览器。
2.路由定义的网址和非路由定义的网址有什么区别?
id=4 来确定要显示的内容类型。
另外,可以在 URL 模式中包含占位符,以便无需查询字符串,即可将变量数据传递到请求处理程序。
/Products/show/beverages 片断将被解释为应用程序中一个文件的路径。
好了暂时先简单的说以上两个问题,或许有的同学还是很迷糊,那么我们再进一步的理一下.
我们可以把类似这样的过程简单的看成是请求和响应的过程,那么asp.net路由在这个中间环节怎么处理的哪?
程序通过向 URL 中的控制器值添加后缀“Controller”以确定将处理请求的控制器的类型名称,来确定要调用的控制器。 URL 中的操作值确定要调用的操作方法。
例如,包含 URL 路径 /Products 的 URL 映射到名为 ProductsController 的控制器。 action 参数中的值是调用的操作方法的名称。 包含 URL 路径 /Products/show 的 URL 将导致调用 ProductsController 类的 Show 方法。
在MVC应用程序中无论是页面的跳转以及链接的显示都是要参考全局处理程序中路由的定义,以使我们能够动态的输出网址。
我们找到Global.ascx文件打开,找到其中的定义的默认路由来初步认识一下它的定义:
1 public class MvcApplication : System.Web.HttpApplication 2 { 3 public static void RegisterGlobalFilters(GlobalFilterCollection filters) 4 { 5 filters.Add(new HandleErrorAttribute()); 6 } 7 8 public static void RegisterRoutes(RouteCollection routes) 9 { 10 routes.IgnoreRoute("{resource}.axd/{*pathInfo}"); 11 12 routes.MapRoute( 13 "Default", // 路由名称 14 "{controller}/{action}/{id}", // 带有参数的 URL 15 new { controller = "Home", action = "Index", id = UrlParameter.Optional } // 参数默认值 16 ); 17 18 } 19 20 protected void Application_Start() 21 { 22 AreaRegistration.RegisterAllAreas(); 23 24 // 默认情况下对 Entity Framework 使用 LocalDB 25 Database.DefaultConnectionFactory = new SqlConnectionFactory(@"Data Source=(localdb)\v11.0; Integrated Security=True; MultipleActiveResultSets=True"); 26 27 RegisterGlobalFilters(GlobalFilters.Filters); 28 RegisterRoutes(RouteTable.Routes); 29 } 30 }
我们知道所有ASP.NETMVC应用程序执行入口是HttpApplication的Application_Start(),所有的Asp.netMVC Routing都在这里定义,来看这一句子:
RegisterRoutes(RouteTable.Routes); 那么又带我转向了RegisterRoutes这个函数的定义处:
routes.IgnoreRoute("{resource}.axd/{*pathInfo}");// {resource}代表一个名为resource的RouteValue表达式,只是一个变量名的占位符,是用来放置用不到的变量。{*pathInfo}用于匹配所有完整的路由信息中除去{resource}.axd部分剩余的部分,当然是这个*的作用,如果没有,则不能匹配完全,来举个例子asd.axd/a/c/v ,如果是{*pathInfo}那么就会全部匹配asd.axd/a/c/v ,如果是{pathInfo}则只会匹配到asd.axd/a。之所以在途中标注是占位符,这些占位符的名字其实起什么都可以。
new { controller = "Home", action = "Index", id = UrlParameter.Optional } // 参数默认值
MapRoute(RouteCollection, String, String, Object, Object))可以指定默认值。
下面的示例演示一个与未知数量的段匹配的路由模式。
query/{queryname}/{*queryvalues}
ASP.NET 路由处理 URL 请求时,在示例中演示的路由定义得到下表列出的结果。
向路由添加约束
Match 方法返回一个布尔值,该值指示参数值是否有效。
MapRoute 方法。)
public static void RegisterRoutes(RouteCollection routes) { routes.MapPageRoute("", "Category/{action}/{categoryName}", "~/categoriespage.aspx", true, new RouteValueDictionary {{"categoryName", "food"}, {"action", "show"}}, new RouteValueDictionary {{"locale", "[a-z]{2}-[a-z]{2}"},{"year", @"\d{4}"}} ); }
路由处理 URL 请求时,在上一示例中演示的路由定义生成下表列出的结果。
默认情况下,路由不处理映射到 Web 服务器上现有物理文件的请求。
{controller}/{action}/{id}),路由也不处理该请求。
true 后,与定义的模式匹配的所有请求都将由路由处理。
为 URL 模式显式禁用路由
下面的示例演示如何阻止路由处理 WebResource.axd 文件的请求。
public static void RegisterRoutes(RouteCollection routes) { routes.Ignore("{resource}.axd/{*pathInfo}"); }