ASP.NET MVC 5路由问题

时间:2017-01-01 22:11:18

标签: asp.net-mvc-5

我有以下路由映射:

        routes.MapRoute(
            name: "Post-Details",
            url: "{catSlug}/{postSlug}",
            defaults: new { controller = "BlogPost", action = "Details", catSlug = UrlParameter.Optional, postSlug = UrlParameter.Optional }
        );

        routes.MapRoute(
            name: "Default",
            url: "{action}",
            defaults: new { controller = "Home", action = "Index" }
        );

我无法理解为什么当我尝试加载localhost:port / Index时使用Post-Details。

当我改变他们的位置(Post-Details在Default之后)时,一切都很好。

还是我的另一条路线:

        routes.MapRoute(
            name: "Category",
            url: "{catSlug}",
            defaults: new { controller = "Category", action = "Index", catSlug = UrlParameter.Optional }
        );

无法在任何地方使用。如果我在默认路由后使用它,我总是会收到此错误:

Description: HTTP 404. The resource you are looking for (or one of its dependencies) could have been removed, had its name changed, or is temporarily unavailable.  Please review the following URL and make sure that it is spelled correctly. 

如果我尝试在默认路由之前使用它,我会得到相同的结果 - 尝试加载localhost:port / Index,然后使用类别路由......

任何帮助将不胜感激。

提前致谢!

编辑1:

我不确定,但我认为Post-Details和Category路线可能互相干扰......当我注释掉Category路线时,应该使用此路线的链接变得不可用。

1 个答案:

答案 0 :(得分:1)

您的"后详细信息"路线将"匹配"具有零个,一个或两个段的任何URL,因为两个参数都标记为可选。因此,如果您先注册,是的,它将解释"索引" in" localhost / index"作为一个catSlug。

MVC路由的工作原理如下:对于任何传入的URL,MVC会检查从顶部开始的路由,直到找到一个"匹配"。 (此时它并不知道/关心实际存在哪些控制器或动作 - 它纯粹将URL与路由的" url"属性进行比较。当第一个匹配的路由是发现,所有后续路线都被忽略。

因此,您遇到的基本问题是从路由逻辑的角度来看," localhost / controller / action"与" localhost / myCategory / myPost"没有什么不同 - 它们都只是带有两个段的网址,因此它们会匹配相同的路线(除非您的路线中有文字,请参见下文:)

如果你真的不想拥有像#34; locatlhost / cat / mycategory / mypost"这样的网址,你有几个选择。您可以为每个控制器硬编码路由,例如

url:"home/{action}",
defaults: new { controller = "Home"}

但那有点凌乱。您可以在所有不属于类别或类别/帖子网址的网址上添加前缀,如下所示:

url:"restofsite/{controller}/{action}",

附注,可能有帮助或可能没有帮助:您可能希望查看属性路由:https://blogs.msdn.microsoft.com/webdev/2013/10/17/attribute-routing-in-asp-net-mvc-5/