摘要:原文地址:Upcoming Changes In Routing
纠正了一些我们刚发现的小错误。预览代码是不是很有趣?
我们已经做了一些修改让routing更加有力和有用,但就像Ben叔叔说的,能力越大责任越大(?好像是周星星说的吧?^_^)。我首先会列出修改的内容,然后讨论一下修改的含义。
Routes不再视点符号“.”为分隔符。当前,routes视.和/号为特殊符号。他们是分隔符号。在这次修改后只把/号作为分隔符号了。
Routes在一个部分中可以有多个(不相邻)url 参数。当前,URL 参数在一个route中在分隔符间必须填满空间,比如:{param1}/{param2}.{param3}。在修改之后,一个URL部分可以有一个以上的参数,只要它们是有符号分开的,比如:{param1}.{ext}/{param3}-{param4}。
通过带"."号的参数值
这次修改,点号成了另外一个意思。它不再是“特殊”的了。比如,你建了一个网站,能提供其他网站的信息。你可能想支持像下面这样连接:
http://site-info.example.com/site/www.haacked.com/rss
http://site-info.example.com/site/www.haacked.com/stats
第一条URL将显示关于www.haacked.com Rss种子信息,而第二条URL将显示网站的统计信息。为了这些,你可能需要定义下面的route。
routes.Add(new Route("site/{domain}/{action}"
, new MvcRouteHandler())
{
Defaults=new RouteValueDictionary(new {controller="site"})
});
这个routes有下面的controller和action方法。
public class SiteController : Controller
{
public void Rss(string domain)
{
RssData rss = GetRssData(domain);
RenderView("Rss", rss);
}
public void Stats(string domain)
{
SiteStatistics stats = GetSiteStatistics(domain);
RenderView("Stats", stats);
}
}
这里的基本思路是我们的域(这里例子里的www.haacked.com)将得到action方法的域参数。这里的问题是,它不能运行在以前的routing系统中 ,因为老的routing认为点号是分隔符。你需要这样site/{sub}.{domain}.{toplevel}/{action}定义routes的urls,但这不能工作有两个子域或者没有子域的情况下。
我们不再视点号为特殊符号,以上的情况就能成为可能了。
多个URL部分
怎么样添加多个URL部分?它仍旧允许使用和做扩展的URLs的routing。比如,假如 你想route一个请求给action方法:
public void List(string category, string format)
旧的和新的routing,你都可以匹配这个请求为下面的URL...
/products/list/beverages.xml
使用下面的route
{controller}/{action}/{category}.{format}
去执行那个action方法。但是,假如 你不想使用文件扩展名,而仍旧想指定format使用一个专门的路径。使用新的Routing,你可以使用任何的字符作为分隔符,比如,可能你想使用“-”符号作为分隔符。你可以匹配下面的URL
/products/list/beverages-xml
使用下面的route
{controller}/{action}/{category}-{format}
这样仍旧可以执行action方法。
注意 我们现在允许任何字符成为分隔符。因此,如果你真的想,虽然不知道你为什么要那么做,你可以使用BLAH去分隔fromat你可以匹配下面的route
/products/list/beveragesBLAHxml
使用route
{controller}/{action}/{category}BLAH{format}
它仍旧会route到相同的方法上。
Consequences
这使的routing更加强大,但也会有些后果,你必须知道的。
比如:使用默认的在asp.net mvc预览第二版项目模板定义的routes,一个请求“/Default.aspx”将会失败,因为它不能发现controller使用名字“Default.aspx”。Huh?“/Default.aspx”现在必须匹配route {controller}/{action}/{id},因为我们不能视点号为特殊字符了。
不仅如此,对/images/jpegs/foo.jpg?请求会是怎样?routing是不是会试着路由到controller="images",action="jpegs",id="foo.jpg"?
我们做出决定,在默认情况下,routing不允许文件在本地磁盘上。现在routing在试图route前将会检查文件是否在磁盘上(通过虚拟路径提供者)。
如果文件在磁盘上,我们将弹出和不会route,并让web server作为正常请求处理。如果文件不存在,我们会试图运行routing.这样可以确保我们不能循环的请求磁盘上的静态资源。当然,这些默认的设置是可以改变的,通过设置RouteTable.Routes.RouteExistingFiles=true.
为什么现在写blog为这些?
Dynamic Data工作组赢了让MVC组修改了routing。:) 他们发布了一个最新的Dynamic Data预览版包含了最新的routing dll.
查看ScottGu’s post on the subject.我真的感觉Dynamic Data是asp.net工作组中最被低估的新技术。当你深入研究,这真是非常cool."scaffolding"只是冰山一角。
安装Dynamic Data预览版需要将routing......[
阅读全文]