路由的基本原则是从上到下进行评估,路由系统使用第一个匹配,而不是最佳匹配。
这意味着您必须按照具体的顺序对路线进行排序,首先是最具体的路线,最后是最一般的路线。
记住这个原则,让我们看看你的情况。最初,您仅定义了默认路由:
routes.MapRoute("Default",
"{controller}/{action}/{id}",
new { controller = "Account", action = "Index", id = UrlParameter.Optional }
);
URL 模式为“{controller}/{action}/{id}”。就其本身而言,这将匹配任何三段 URL,并且不会匹配任何少于三段的 URL。然而,第三输入参数是默认参数,其定义第一段和第二段的默认值并指示第三段是可选的。这样做的下一个效果是使路由匹配具有 0、1、2 或 3 段的 URL。
现在您想要添加一个路由,其中第三个 URL 段映射到“statusName”参数,并且可以处理如下 URL:
OrderManager/List/New
OrderManager/List/Viewed
您可以在此处采用两种基本方法。您可以 1) 创建一个仅处理这两个 URL 的非常具体的路由,或者 2) 您可以尝试创建一个更通用的路由来处理一般情况。我们先来看第一个案例。您可以按如下方式创建路线:
routes.MapRoute("", "OrderManager/List/{statusName}",
new { Controller = "OrderManager", Action = "List" });
请注意,由于该路由比默认路由更具体,因此必须将此路由放在before默认路由。
如果您想要一个更通用的路由,您需要决定该路由与默认路由有何不同,因为它们都将匹配具有三段的 URL。假设您决定新路由将接受第三段中仅包含字母的任何内容,而让默认路由处理包含数字的任何内容。您可以使用路线约束来做到这一点。例如,您可以编写如下路线:
routes.MapRoute(
name: "Default",
url: "{controller}/{action}/{id}",
defaults: new { controller = "Home", action = "Index", id = UrlParameter.Optional },
constraints: new { id = @"^\d+$" });
routes.MapRoute(
name: "NewRoute",
url: "{controller}/{action}/{statusName}",
defaults: new { Controller = "OrderManager", Action = "List" },
constraints: new { statusName = "^[A-Za-z]+$" });
通过这两个路由,任何第三段中只有字母的三段 URL 都会将第三段放入名为“statusName”的变量中,而任何第三段中包含整数的 URL 会将第三段放入名为“”的变量中。 ID”。
在任何真正复杂的应用程序中,路由可能会变得复杂,为路由编写单元测试非常有利,以确保在添加或修改路由时不会把事情搞砸。
有关路由的良好参考,请参阅斯科特·桑德森的书 https://rads.stackoverflow.com/amzn/click/com/1430234040或查看MSDN 文档 http://msdn.microsoft.com/en-us/library/cc668201(v=vs.100).aspx