ASP.NET MVC 学习一之路由

 

本次学习的所有开发环境皆为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 =@"\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" }
                );

郑重声明:本站内容如果来自互联网及其他传播媒体,其版权均属原媒体及文章作者所有。转载目的在于传递更多信息及用于网络分享,并不代表本站赞同其观点和对其真实性负责,也不构成任何其他建议。