【发布时间】:2009-01-22 09:36:37
【问题描述】:
我在 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" }
);
这里的第二条规则允许我创建一个 url /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(或查看源代码)中将鼠标悬停在此命令上时,URL 变为 /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 到底如何能够确定我想要那个链接?
显然正在完成某种“聪明”的反向映射。我似乎找不到任何有关此的文档,并想了解更多信息。
我认为它必须解析它找到的 FIRST 规则或类似的东西,但这似乎有点可怕,因为我想知道发生了什么。
注意:有一个关于路由的very nice article - 包括从 ScottGu 博客上的路由表生成 URL。不幸的是,我似乎无法在该博客中找到对我的情况的解释。
【问题讨论】:
标签: .net asp.net-mvc