Route使用和扩展
Route:路由,MVC项目在创建时会在App_Start文件夹下自动创建RouteConfig.cs类,在RouteConfig.cs类中创建路由规则匹配,在Global.asax里注册路由。
MVC项目注册路由的顺序:MvcApplication--Application_Start--RegisterRoutes--给RouteCollection添加规则
请求进到网站--X--请求地址被路由按顺序匹配--遇到一个吻合的结束---就到对应的控制器和action
路由规则
路由是按照注册顺序进行匹配,遇到第一个吻合的就结束匹配;每个请求只会被一个路由匹配上
忽略路由
routes.IgnoreRoute("{resource}.axd/{*pathInfo}");
正则表达式 {resource}表示变量 a.axd/xxxx resource=a pathInfo=xxxx
routes.IgnoreRoute("CustomService/{*pathInfo}");//以CustomService开头,都不走路由。
axd是历史原因,最开始都是webform,请求都是.aspx后缀,IIS根据后缀转发请求;MVC出现了,没有后缀,IIS6以及更早版本,打了个补丁,把mvc的请求加上个.axd的后缀,然后这种都转发到网站----新版本的IIS已经不需要了,遇到了就直接忽略,还是走原始流程。
常规路由
//一般来说,我们不会扩展这个路由
routes.MapRoute(
name: "Default",//路由名称,RouteCollection是key-value,key 避免重复
url: "{controller}/{action}/{id}",//正则规则:两个斜线 3个变量
defaults: new { controller = "Home", action = "Index", id = UrlParameter.Optional }
//默认值 没有id变量 就是UrlParameter.Optional 没有action就是index 没有controller是home
);
扩展路由
routes.MapRoute(
name: "About",
url: "About",
defaults: new { controller = "Home", action = "About", id = UrlParameter.Optional }
);//固定路由,/Home/About----About
routes.MapRoute(
name: "Test",
url: "Test/{action}/{id}",
defaults: new { controller = "Second", action = "Index", id = UrlParameter.Optional }
);//修改控制器,
routes.MapRoute(
name: "Regex",
url: "{controller}/{action}_{year}_{month}_{day}",
defaults: new { controller = "Second", action = "Index", id = UrlParameter.Optional },
constraints: new { year = @"d{4}", month = @"d{2}", day = @"d{2}" }
);
//默认路由
routes.MapRoute(
name: "Default",
url: "{controller}/{action}/{id}",
defaults: new { controller = "Home", action = "Index", id = UrlParameter.Optional }
controller是home
);
//http://localhost:2017/second/Time_2019_06_13 Regex
//http://localhost:2017/second/Time_2019_6_13 失败
//http://localhost:2017/second/Time?year=2019&month=6&day=13 Default
//http://localhost:2017/test/Time?year=2019&month=6&day=13 Test
//http://localhost:2017/test/Time_2019_06_13 失败的,只会被一个路由匹配
Area
Area:诞生的原因
因为一个Web项目可以非常大非常复杂,多人合作开发,命名就成问题了,Area可以把项目拆分开,方便团队合作;演变到后面可以做成插件式开发.
Area的注册和Route的注册很相似,都是创建匹配规则。在创建MVC项目时,添加区域,自动创建(AreaName)reaRegistration.cs,在(AreaName)reaRegistration.cs中创建Area匹配规则
Area也可以独立开,规则是必须有个继承AreaRegistration
MVC中Area注册的顺序:
MvcApplication--Application_Start--AreaRegistration.RegisterAllAreas()---其实就是把SystemAreaRegistration给注册下---添加URL地址规则--请求来了就匹配(area在普通的之前)
小结
众所周知,MVC请求的最后是反射调用的controller+action,信息来自于url+route,路由匹配时,只能找到action和controller, 其实还有个步骤,扫描+存储,在bin里面找Controller的子类,然后把命名空间--类名称+全部方法都存起来
a 控制器类可以出现在MVC项目之外,唯一的规则就是继承自Controller
b Area也可以独立开,规则是必须有个继承AreaRegistration
Razor语法
前后端语法混编,cshtml本质是一个类文件,混编了html+cs代码
写后台代码:
单行
@{int i = 3; int m = 4;}
多行
@{
//多行
ViewBag.Title = "Index";
int k = 5;
}
行内
<h3>行内:@ViewBag.Title</h3>
关键字
@for (int l = 0; l < 10; l++)
{
<a href="www.baidu.com">这里是个链接 @l</a><br>
}