路由原理
为什么要定义路由
-
ASP.NET-MVC项目开发中的地位
路由的定义->URL访问规则,占用的开发量很小,但是非常重要,因为任何请求都离不开路由
-
几个URL
-
路由的好处
-
能够根据系统要求,灵活的划分请求规则
-
隐藏服务器端物理文件的路径,提高程序的安全性,以上情况是无法根据URL分析视图文件在站点中的目录位置
-
有利于搜索引擎优化,可以将URL请求统一规范,以后在维护中如果发生变化,URL可以保持不变
-
MVC路由
-
路由:源自网络中的路由器的概念
路由器:负责网络中数据的传输路径
-
MVC路由:主要负责将各种URL请求转发给控制器处理
-
路由的双向系统功能
-
URL正确映射到Controller和Action:根据用户输入的URL触发对应的控制器并调用动作方法
-
Controller和Action还可以反向映射并构造URL:根据控制器和行为构造出URL供用户使用
-
-
MVC的工作过程
默认路由
RouteConfig.cs中的URL规则的定义
routes.IgnoreRoute("{resource}.axd/{*pathInfo}");
routes.MapRoute(
name: "Default",
url: "{controller}/{action}/{id}",
defaults: new { controller = "Home", action = "Index", id = UrlParameter.Optional }
);
URL模式
-
上面URL中的参数值:“{controller}/{action}/{id}”,称之为URL模式
-
该模式是一种字符串,包含一些固定的“字符字面量”和“占位符”,占位符使用{}表示
-
URL模式规定了URL路径的定义规则
URL模式
定义语法
{占位符1}字面量{占位符2}字面量...{占位符n}字面量n
占位符
-
占位符可以是一个字符串或字符,比如"x","id","year"等
-
字面量可以是一个比较固定的字符,比较常见的是斜杠"/";也可以是字符串
特殊规则
-
不能以斜杠"/"或波浪线"~"字符开头,不能包含"?"
-
占位符不能连续
匹配要求
路由的匹配规则和正则表达式原理一样
-
字面量:必须严格匹配,即实际请求中的字符串和路由模式中的字面量字符串必须要完全一致
-
大小写:URL模式匹配的时候不区分大小写
-
常量:没有包含在大括号内的信息被称为常量对待,例如"Admin/{controller}/{action}/{id}"
匹配原理
URL模式 | 实际URL |
---|---|
{controller}/{action}/{id} | http://localhost/Student/Index/1 |
{first}/{second}/{thrid} | http://localhost/Student/Index/1 |
blog/{article}/{id} | http://localhost/blog/view/1 |
blog-{article}/{id} | http://localhost/blog-view/1 |
多个路由
-
route.MapRoute()定义路由的要求
MapRoute( string name,//名称 string url,//URL模式 object defaults,//路由的默认值 object constraints,//约束,可以忽略 string[] namespaces//命名空间,可以忽略 )
-
定义多个路由
routes.MapRoute( name: "Test1", url: "{first}-{second}-{third}", defaults: new { controller = "Student", action = "Update", id = UrlParameter.Optional } ); routes.MapRoute( name: "Default", url: "{controller}/{action}/{id}", defaults: new { controller = "Home", action = "Index", id = UrlParameter.Optional } );
如果有多个路由,那么从第一个路由往下寻找,找到第一个匹配的路由之后立刻停止往下寻找
-
UrlParameter.Optional
-
该参数可以作为路由参数的默认值
-
当需要让“Home/Index”或者“/Home”能正常匹配,但又不希望赋一个无意义的值,可以使用该参数
-
路由匹配
关于{controller}/{action}
-
必不可少:在一个实际的MVC系统中,{controller}/{action}必不可少,如果缺少就会出现找不到路径而出错
-
约定规则:这个占位符是MVC里面约定的,而且会被解析成控制器和对应的方法
-
位置灵活:这两个约定的占位符可以在任意位置
其他占位符
-
仅仅是占位符:比如:{aa}/{bb}/{cc},这里面的aa不能被解析成控制器,bb也不能被解析为动作方法
-
默认要求:一个路由中,如果没有规定{controller}/{action},或者只是规定了其中之一,则没有规定的部分将使用默认值
匹配顺序
-
优先使用:多个路由匹配一个URL,则有限匹配的会被使用
-
尽量避免:定义多个路由是,尽量避免出现多匹配
路由数据
存储方法
-
在ASP.NET MVC路由系统中,RouteData对象用来保存URL模式和实际的URL匹配产生的路由数据
-
路由数据保存方式为:“键值对”,RouteData是视图基类和控制器基类的属性
路由和控制器的映射
{controller}和{action}在程序运行中的映射
{controller}=Home
{action}=Index
“约定大于配置”在ASP.NET MVC中非常重要
路由数据的使用
-
RouteData.Values
是RouteValueDictionary类型,使用方式和Dictionary<TKey,TValue>类似
RouteData定义为视图和控制器基类的属性
在视图中可以遍历RouteData.Values,来输出路由匹配产生的路由数据
-
用来匹配URL剩余部分
-
贪婪匹配规则
会找到最后一个符合条件的“字面量”为止
路由约束:可以采用正则对路由进行约束
路由生成URL
视图中的连接
连接方式
-
纯静态连接:直接指向链接地址,一般不需要改变
-
动态链接:为了更好的保证Web项目移植的时候路径正确
Url.Content()方法
<img src="@Url.Content("~/img/BP03.png")" alt="Alternate Text" />
不足:当路由规则变化时,需要修改所有路径
Url.Action()方法
public string Action(
string actionName,//动作方法名称
string controllerName,//控制器名称(没有时,默认使用当前上下文的控制器),
object routeValues //路由参数值(是一个匿名对象)
)
使用情况是给超链接等设置链接地址
ActionLink()方法
Html.ActionLink()方法主要是为了生成超链接
MvcHtmlString ActionLink(
string linkText,//超链接文本
string actionName,
string controllerName,
object routeValues,//路由参数值(是一个匿名对象)
object htmlAttributes//生成的html属性(是一个匿名对象)
)
使用Html.RouteLink()可以代替Html.ActionLink()
可以使用Html.Action()可以代替Url.Action()