MVC5(二)

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",//路由名称,RouteCollectionkey-valuekey 避免重复

      url: "{controller}/{action}/{id}",//正则规则:两个斜线 3个变量

      defaults: new { controller = "Home", action = "Index", id = UrlParameter.Optional }

      //默认值 没有id变量 就是UrlParameter.Optional  没有action就是index  没有controllerhome

  );

扩展路由

  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 }

      controllerhome

  );

  //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

MVCArea注册的顺序:

MvcApplication--Application_Start--AreaRegistration.RegisterAllAreas()---其实就是把SystemAreaRegistration给注册下---添加URL地址规则--请求来了就匹配(area在普通的之前)

小结

众所周知,MVC请求的最后是反射调用的controller+action,信息来自于url+route,路由匹配时,只能找到actioncontroller,  其实还有个步骤,扫描+存储,在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>

}

猜你喜欢

转载自www.cnblogs.com/JohnTang/p/11048971.html