日期:2014-05-18  浏览次数:20379 次

asp.net mvc里面有多级目录的网站。URL规则要怎么写?
以前WebForm倒是比较好写的。
比如一个站里面

/Default.aspx 主站首页
/IT/Default.aspx IT部首页
/IT/Product/Default.aspx IT部产品栏目首页
/HR/Default.aspx 人力资源部首页。

我只要分不同的目录就可以了。

但是Asp.net MVC里面

大部分都是

/Controller/Action/
这样的结构。。



我们么样去实现这样的URL的路由规则呢?


比如
http://www.xxx.com/ 主站首页
http://www.xxx.com/HOME/ 主站首页
这个肯定是没问题。

但是这样的呢

http://www.xxx.com/IT/PRODUCT/ IT部产品你首页。
http://www.xxx.com/HR/Resume/WriteResume 人力资源部,简历投递栏目的简历投递表格页。


------解决方案--------------------
路由规则是可以自定义的,要用到ASP.NET 3.5 SP1里面新加入的Routing类。

和原始网页的位置没有关系,可以都放到一个目录里面,比如根目录:
IT部产品首页:
~/ItProduct.aspx
人力资源部,简历投递栏目的简历投递表格页
~/HrWriteResume.aspx

然后在Global.asax中定义路由规则:
Route r = new Route("IT/PRODUCT", RouteHandler1());
Route r2 = new Route("HR/Resume/WriteResume", RounteHandler2());

最后新建RouteHandler1()和RouteHandler2()这两个类来解析地址,没参数的Handler定义只需要一句话
比如在RouteHandler1()中定义:
return (Page)BuildManager.CreateInstanceFromVirtualPath("~/ItProduct.aspx", typeof(Page));

这样用户输入http://www.xxx.com/IT/PRODUCT/, 就会自动路由到http://www.xxx.com/ItProduct.aspx这个实际地址,当然用户浏览器的地址仍然是http://www.xxx.com/IT/PRODUCT/


在Global的定义中也可以加入参数,比如IT/PRODUCT/{parameter}
这样可以实现现在MVC中比较流行的DEEP LINK,意思就可以体现出意义的URL,比如当用户访问
http://www.xxx.com/IT/PRODUCT/HardDisk/Sony/
可能它的实际地址是
http://www.xxx.com/ItProduct.aspx?CategoryId=xxx-xxx-xxx&ProductId=123-123-123

另外这个不光是在ASP.NET MVC中,现有的传统ASP.NET也可以利用这个SP1里面新加入来路由网址,比以前的“网址重写”要好不少,至少不用每个页面都手动改PostBack地址了。

详细的用法就查查MSDN吧。