对于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/atriclesID和http://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}的内容。
这样看着就好多了。但是总感觉代码中很多小毛病,思路也不是很周密,所以发上来让大伙瞧瞧,指点一下。


浙公网安备 33010602011771号