本次学习的所有开发环境皆为VS2012+MVC4
一:什么是MVC:
假设你是第一次学习MVC,好吧我们不去理解它内部是如何去实现功能的,我们只从它表面的字母意思先去入门理解吧
M:models(模型) V:view(视图) C:controllers(控制器)
先不要去纠结这三个字母是什么东西吧,以及这三个东西有什么用!我们所要用的就是先记下这个三个字母!呵呵,是不是有点死记硬背的赶脚,我也是这么觉得的,有点想扔砖的感觉!(麻痹,博主想讲的啥!!!-__-!)
二:MVC学习之路由
在此新建一个测试项目Home,并添加一个Controllers取名为HomeControllers,并为其添加一个Index视图;
项目文件如图:
双击打开Index.cshtml视图,更改其代码:
@{ ViewBag.Title = "Index"; } <h2>Hello World</h2>
运行项目我们已经发现程序能正确运行
也许到这你可能会惊讶于mvc是如何能工作并找到其工作文件的.
呵呵,聪明的你可能已经猜到了接下来就是路由登场了。
双击RouteConfig文件
public static void RegisterRoutes(RouteCollection routes) { routes.IgnoreRoute("{resource}.axd/{*pathInfo}"); routes.MapRoute( name: "Default", url: "{controller}/{action}/{id}", defaults: new { controller = "Home", action = "Index", id = UrlParameter.Optional } ); }
这就是MVC内部定义的路由机制
routes.IgnoreRoute("{resource}.axd/{*pathInfo}");
对着句代码的意思先暂且理解为
对所有axd的资源 进行忽略,直接进行URL访问
routes.MapRoute( name: "Default", url: "{controller}/{action}/{id}", defaults: new { controller = "Home", action = "Index", id = UrlParameter.Optional } );
这是一条简单的路由规则,name属性定义了路由的名称,url定义了路由的映射机制,defaults定义了路由的默认参数
实际{controller}就是对应着我们前面的controller的名称Home,action对应我们前面定义的Index,所以我们在浏览器中输入
www.Test.com/Home/Index就可以成功看到效果了!
好吧,到这里我们来定义一个属于自己的路由吧
routes.MapRoute( name: "myRoute", url: "{controller}-{action}" );
这里我没有给myRoute的路由定义默认的属性,当然我们运行项目,项目初始化后当然是找不到的,手动在浏览器中输入
www.Test.com/Home-Index就可以正确显示视图了,到这你是不是能体会到mvc的一个优势来呢,当然你可以定义更多个性化的url路由来方便SEO
routes.MapRoute( name: "myRoute", url: "{controller}-{action}" ); routes.MapRoute( name: "Default", url: "{controller}/{action}/{id}", defaults: new { controller = "Home", action = "Index", id = UrlParameter.Optional } );
这里需要补充一下,在这个项目中如果定义了两个路由规则,mvc会自动从上往下匹配路由规则,如果myRoute的路由规则没有匹配上就会匹配default的路由规则,如果两个都没匹配到,则会报错!
路由值的简单约束
刚才在name为“Default”的路由上id = UrlParameter.Optional,这句话的意思是id为可选输入,当我们去掉id = UrlParameter.Optional的时候,运行项目发现报错了,在url上给地址加上www.Test.com/Home/Index/1路由正确。
routes.MapRoute( name: "Default", url: "{controller}/{action}/{id}", defaults: new { controller = "Home", action = "Index", id = UrlParameter.Optional }, //加上路由值的条件约束 constraints: new { id = @"\d+" } );
此时我们给路由器的id属性添加一个约束条件规定id只能为数字,如果此时在浏览器输入
www.Test.com/Home/Index/1test的url则会报错
附上一个自己总结的几个路由规则吧
routes.IgnoreRoute("{resource}.axd/{*pathInfo}"); routes.MapRoute( name: "Default", url: "{controller}/{action}/{id}", defaults: new { controller = "Home", action = "Index", id = UrlParameter.Optional }, constraints: new { controller = @"\d{4}" } // constraints: new { controller [email protected]"\d{4}"} ); //hotels/所有匹配 routes.MapRoute( name: "酒店首页", url: "Home/{*values}", defaults: new { controller = "Home", action = "Index", hotelid = "" } ); routes.MapRoute( name: "网站首页", url: "{*values}", defaults: new { controller = "Home", action = "Index" } );