ASP.NET MVC的路由文件太聪明了,我怎么看不清楚!

时间:2009-01-22 09:36:37

标签: .net asp.net-mvc

我在ASP.NET MVC应用程序中有两个路由规则:

            routes.MapRoute(
               "Products AJAX",
               "Products/Ajax/{action}",
               new { controller = "Products" }
            );

            routes.MapRoute(
               "Product",                                             
               "Products/{id}",                                        
               new { controller = "Products", action = "ViewProduct", id = "1001" }  
            );

此处的第二条规则允许我创建一个网址/Products/1002来查看产品1002.这是我创建的原始唯一规则。

我想在视图上添加一些AJAX,以允许它检索一个简单的字符串:

 public class ProductsController : Controller {
    public ContentResult GetStatus()
        {
            return new ContentResult()
            {
                Content = "Status is OK at " + DateTime.Now.ToLongTimeString()
            };
        }
  }

这就是我添加上面第一个路由规则的原因。我希望它是一个更具体的URL,可用于转到我的控制器中定义的任何其他操作。 (如果我没有这个规则,它会尝试找到一个SKU为'GetStatus'的产品,这是不好的!)

所以我认为没关系,我只需要在我的视图中编写我的AJAX命令:

<%= Ajax.ActionLink("Update Status", "AJAX/GetStatus", new AjaxOptions { UpdateTargetId = "status" })%>

我认为这会调用链接Products/AJAX/GetStatus,这将触发第一个路由规则并正确地转到我的控制器的GetStatus方法。

令我惊讶的是,当我将鼠标悬停在Internet Explorer(或查看源代码)中的此命令上时,该网址变为/Products/AJAX/AJAX/GetStatus

所以我在想,但是我回头去做一些侦探工作。

我将我的第一条规则改为:

MapRoute(
               "Products AJAX",
               "Products/Foo/{action}",
               new { controller = "Products" }
            );

我将行动改为

<%= Ajax.ActionLink("Update Status", "GetStatus", new AjaxOptions { UpdateTargetId = "status" })%>

令我惊讶的是,为此ActionLink生成的URL实际上是/ Products / Foo / GetStatus。这基于我的第一个规则正确转发到我的AJAX处理程序,一切都很好。当然,/ Products / 1003的链接将匹配第二个规则并转到产品1003。

我的申请已经完成!我很高兴 - 有点儿。

但我不知道为什么!我的整个代码库中只有Foo的位置在我的映射规则中,所以Ajax.ActionLink如何能够找出我想要的链接?

显然,正在进行某种“聪明”的反向映射。我似乎无法找到任何关于此的文档,并希望了解更多。

我认为它必须解析它找到的第一条规则或类似的东西,但它似乎有点可怕,因为我想知道最新情况。

注意:有关于路由的very nice article - 包括从ScottGu博客上的路由表生成URL。不幸的是,我似乎找不到在我的博客中发生的事情的解释。

2 个答案:

答案 0 :(得分:1)

既然您有一条命名路线,为什么不使用它呢?而是使用Ajax.RouteLink,并指定路由名称。然后你不必担心ASP.NET“猜测”错误的路由。它不会伤害任何this is faster, too

答案 1 :(得分:0)

是的,这就是ActionLink助手和路由的重点 - 如果你改变整个路由结构,你只需要在一个地方更新它,并且ActionLinks继续生成正确的URL。

进一步详细说明,当你使用ActionLink助手时,你实际上是在对系统说“链接到控制器和动作,我不在乎如何完成”