对于route的一些理解

    虽然刚毕业,现在从事非编程的工作,但是作为一种专业爱好,平时坚持看一些技术文章,做一些小的例子来实践,希望在博客园写下来自己的一些理解。

    学习mvc是从毕业课题开始的,那时候大概看了一下,选作Pro.ASP.NET.MVC.2.Framework.2nd.Edition.Jun.2010我的入门教材,本身英语不是太好,借助各种工具还是可以读的,磕磕碰碰读到第二部分,后来看到园子里有个朋友(r01cn)在翻译Pro ASP.NET MVC 3 Framework,虽然是mvc3,但是原作者的思路没变,两本书一块看,理解也更透彻,再后来看到r01cn翻译进度不够快,再加上那时候已经找到工作,相对来说比较闲,就给r01cn发了邮件,想一块翻译,r01cn大哥很爽快也很和善,给我发了翻译范例,于是磕磕碰碰的翻译了两节,后来临近毕业,dan事比较多,来回奔波,也耽误了翻译工作,让r01cn大哥很是失望,现在看到r01cn大哥的心血快要出版成书,很是高兴。只是大家没得看了,哈哈。

    正式工作已经半年,工作相对轻松,每天坐办公室时间比较多,空余时间基本是游戏,看些乱七八糟的。很是无聊,怎么能是园子里的奋发的学习风格,于是重拾代码,很是惭愧。

   对于mvc中的route,其他的不多说,网上书上都有很多,我就说一下自己的理解。

   view层中html.helper的Html.ActionLink和Html.RouteLink还有Url.Action和Url.RouteUrl,生成页面的时候都是根据route表也就是配置文件(Global.asax或者XXXXAreaRegistration.cs)中的routes.MapRoute来生成链接的,也是就是在用以上html.helper类写view层的时候要和routes.MapRoute中的配置相对应。 

   我一般写的时候都是先想好我需要什么样的URL形式,然后列下来,再根据规则去写routes.MapRoute。

   如我学习的示例程序中,我使用了area,分为admin和news两个区域,若是按照默认的路由配置,我的url如下:

 某个新闻内容的url将是http://localhost/news/news/newsshow/atriclesID
 某个类别的新闻列表url将是:http://localhost/news/news/list/category/Page1

   其中第一个news是area区域名,第二个news为Controller的名字,newsshow为NewsController中的action名字。

   这个。。。看着是不是很郁闷啊。
   按照我们常见的思路就是把url改造成http://localhost/newshow/atriclesIDhttp://localhost/category/Page1的形式
   那么我在news区域中route配置如下:

View Code
public override void RegisterArea(AreaRegistrationContext context)
        {
            context.MapRoute(
               null,
               "NewsShow/{News_ID}",
               new { controller = "Newss", action = "NewsShow" }
           );//对应的RouteLink为<%:Html.RouteLink(news.News_Title,  new {controller="Newss",Action="NewsShow",News_ID= news.News_ID })%>
             //生成的url为http://localhost/NewsShow/{News_ID}对应的url为http://localhost/news/newss/NewsShow/{News_ID}
            context.MapRoute(
               null,
               "{category}/Page{page}",
               new { controller = "Newss", action = "List" },
               new { page = @"\d+", category = new NotEqual("List") }
                //这个NotEqual是继承IRouteConstraint接口的类,目的就是为了让category不匹配“List”这个字符串。具体见Stephen Walther的文章
               );
            //对应的Html.RouteLink为(link.Text, link.RouteValues,new {controller = "Newss",action = "List",category = categoryName}))%>
            //生成的url为http://localhost/{category}/Page{page}对应的url为http://localhost/news/Newss/List/{category}/Page{page}
            context.MapRoute
               (
               "null", // 路由名称
               "{category}", // 带有参数的 URL
               new { controller = "Newss", action = "List", page = 1 } // 参数默认值
           ); //生成的url为http://localhost/{category},对应http://localhost/news/newss/list/{category}/page1
            context.MapRoute(
                null,
                "",
                new { controller = "Newss", action = "List", category = (string)null, page = 1 }
                );
            //生成的url为http://localhost/,对应http://localhost/news/newss/list/page1
            context.MapRoute(
               null,
               "{action}/Page{page}",
               new { controller = "Newss", action = "List", category = (string)null },
               new { page = @"\d+" }
               );   //生成的url为http://localhost/Page{page},对应http://localhost/news/newss/list/Page{page}         
            context.MapRoute(
               "NewsContent_default",
               "NewsContent/{controller}/{action}/{id}",
               new { action = "Index", id = UrlParameter.Optional }
           );
        }

 之后,我的练习实例网站的首页是http://localhost 显示的是原本http://localhost/news/newss/list/page1的内容;

 各分类列表的页面为http://localhost/{category}/ 显示的是原本http://localhost/news/newss/list/{category}/page1的内容;

 新闻内容页面为http://localhost/NewsShow/{News_ID}  显示的是原本http://localhost/news/newss/NewsShow/{News_ID}的内容。

这样看着就好多了。但是总感觉代码中很多小毛病,思路也不是很周密,所以发上来让大伙瞧瞧,指点一下。

 

 

posted @ 2013-01-28 13:32  mzwkkk  阅读(222)  评论(0)    收藏  举报