【问题标题】:ASP.NET MVC being too clever with its routing file and I cant see how!ASP.NET MVC 的路由文件太聪明了,我看不出怎么做!
【发布时间】: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


    【解决方案1】:

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

    【讨论】:

    • 谢谢 - 我不知道我能做到这一点。似乎缺少关于 AJAX 的 MS 教程,我只是从随机的地方阅读它。
    • 你碰巧知道它的启发式方法吗?它只是选择第一个路由规则并尝试将其参数粘贴到其中吗?
    • 它选择第一个匹配项。见:haacked.com/archive/2008/03/13/url-routing-debugger.aspx
    【解决方案2】:

    是的,这就是 ActionLink 帮助程序和路由的重点 - 如果您更改整个路由结构,您只需在一处更新它,ActionLink 会继续生成正确的 URL。

    更详细地说,当您使用 ActionLink 帮助器时,您实际上是在对系统说“链接到控制器和操作,我不在乎如何完成”

    【讨论】:

    • 问题正是:如何?我的意思是他可以自己看到它有效。他想知道如何:)。我猜他可以使用 Reflector,但这并不完全是一个解释。
    • 我觉得值得一提,因为他的第一个代码示例似乎在想“我需要在这里提供路线”
    猜你喜欢
    • 2010-10-03
    • 2010-10-29
    • 1970-01-01
    • 1970-01-01
    • 2017-05-25
    • 1970-01-01
    • 2013-08-21
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多