【问题标题】:Why doesn't Default route work using Html.ActionLink in this case?在这种情况下,为什么默认路由不能使用 Html.ActionLink 工作?
【发布时间】:2011-06-04 18:22:56
【问题描述】:

我对路由有一个相当特殊的问题。

在不用担心配置一年后回到路由,我使用默认路由并忽略资源路由:

routes.IgnoreRoute("{resource}.axd/{*pathInfo}");

routes.MapRoute(
        "Default",
        // Route name
        "{controller}/{action}/{id}",

        // URL with parameters
        new
        {
            controller = "Home",
            action = "Index",
            id = UrlParameter.Optional
        });

我有一个RulesController,其中包含对IndexLorem 的操作以及一个Index.aspxLorem.aspx 在“视图”>“规则”目录中。

我在主页面上有一个针对规则/索引的 ActionLink:

<li><div><%: Html.ActionLink("linkText", "Index", "Rules")%></div></li>

链接被呈现为http://localhost:12345/Rules/ 并得到 404。

当我在 URL 中键入 Index 时,应用程序会将其路由到操作。

当我将默认路由操作从"Index" 更改为"Lorem" 时,操作链接将呈现为http://localhost:12345/Rules/Index 添加Index,因为它不再位于默认路由上,并且应用程序路由到索引操作正确。

我使用过Phil Haack's Routing Debugger,但输入网址http://localhost:12345/Rules/ 也会导致404。

我想我已经涵盖了所有新手错误、相关的 SO 问题和基本的 RTFM。

我假设“规则”不是路由中的任何保留字。 除了更新路由和调试它们,我还能看什么?

【问题讨论】:

  • 您是否定义了任何 IgnoreRoutes?您的网站目录中是否有一个名为“Rules”的文件夹?
  • 我确实有默认的忽略路由(现在添加到问题中),并且在文件夹上是;架构师还没有为 Business Objects 创建另一个项目,所以那里有一个“Rules”文件夹。我会重新组织和测试。添加此评论作为答案,以防万一。
  • 去过那里,做到了。我花了很长时间才找到问题!

标签: asp.net-mvc routing http-status-code-404 actionlink


【解决方案1】:

确保在您的网站所在的目录中没有名为“Rules”的文件夹。在其默认配置中,ASP.NET MVC 路由将在路由定义之前尊重物理路径。如果定义了与网站中物理文件夹的路径匹配的路由,则路由引擎将被完全绕过。

您可以通过将RouteTable.Routes.RouteExistingFiles 属性更改为false 来禁用到物理路径的路由,但如果您这样做并且您的应用程序具有指向物理资源(例如图像、脚本、样式表等)的路径,您将需要适应那些具有匹配 IgnoreRoute() 定义的路径。 例如:RouteTable.Routes.IgnoreRoute("content/{*pathInfo}");

【讨论】:

  • 谢谢 Nathan,第二段特别有趣和有用。
猜你喜欢
  • 2016-11-06
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2017-01-07
相关资源
最近更新 更多