RSS 2.0 Feed

Monday, April 14, 2008

这篇就不翻译了,原文献上

If ever someone was undeserving of having others spend their valuable time translating his blog, it would be me. But hey, some people from the http://blog.joycode.com/ site went ahead and did it anyway. I must admit that I’m very flattered that anyone would put the effort in.

Before this, I learned that Subtext powers MySpace China's blogs, and now my blog is translated to Chinese. As David Hasselhoff says, “I’m big in China”. (To my Chinese audience, that is a joke. I am quite small.)

posted @ | Feedback (1) |

原文地址: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 assembly安装进GAC。如果你安装了这个,它可能破坏已经存在MVC预览第二版的站点,因为assembly装载器在assembly版本相同的情况下会优先装载GAC里的版本。而新routing assembly和mvc预览第二版里的版本号是相同的。

    Dynamic Data预览版里的readme已经写了如何更新你的mvc 预览第二版的项目,使它在新的routing里能正常工作。你会注意到readme里推荐将在根目录里default.aspx文件重定位到 /Home.技术上,在根目录里的Default.aspx文件没有必要根据routing的变化做改变。不幸的是,Cassini不能正常的工作,当你为“/“做请求而不在默认的文档。他不能运行任何asp.net modules.因此我们将文件仍旧保存在根目录,但你可能将能移除它当你部署在IIS 7.0中时。因此,我要重申这一点上,在项目根目录里的Default.aspx要确保Cassini工作正确的,在将来不需要IIS7,但现在是需要的。

    我们将有一个新的mvc源代码版本在CodePlex发布,在未来的两三个星期里,它将支持新的routing 引擎。

    www.haacked.com Rss种子信息,而第二条URL将显示网站的统计信息。为了这些,你可能需要定义下面的route。
  • posted @ | Feedback (0) |