我创建了一个示例Internet MVC应用程序。然后使用Index视图创建ProductsController。
然后在路由中,我使用以下路由规则将产品/ prodname / id映射到产品网址。
routes.MapRoute(
name: "ProdDef",
url: "{controller}/{name}/{id}/{action}",
defaults: new { controller = "Products", action = "Index", id = UrlParameter.Optional, name = UrlParameter.Optional }
);
routes.MapRoute(
name: "Default",
url: "{controller}/{action}/{id}",
defaults: new { controller = "Home", action = "Index", id = UrlParameter.Optional }
);
但在此之后,联系页面会将我重定向到主索引控制器操作。 ??为什么这样?我是否遗漏了一些内容,以及在为产品创建一条规则后其他操作为什么停止工作。
答案 0 :(得分:3)
将您的第一条路线改为
routes.MapRoute(
name: "ProdDef",
url: "products/{name}/{id}/{action}",
defaults: new { controller = "Products", action = "Index", id = UrlParameter.Optional, name = UrlParameter.Optional }
);
否则该路线几乎可以匹配任何东西。请记住,路线的顺序很重要,因为将按此顺序尝试匹配。
修改:
这是因为默认情况下,路由处理程序在{controller}/{name}
和{controller}/{action}
之间没有区别。它们的格式相同,只有不同的参数名称。
以下是针对特定网址(例如/Home/Index
。
首先尝试第一条路线,有4个参数,其中2条是可选的,因此如果它们不存在则不会给出任何值,只留下以下值:
正如您所看到的,两个非可选参数都已填充,因此路径将匹配,但不会像您预期的那样运行。无论URL是什么,只要它具有controller
和name
的值,就会发生同样的事情。这让我想到了我的原始答案,如果您希望第一条路线匹配仅产品的传入URL,您需要添加一些允许路由处理程序区分它的东西。通过将{controller}
替换为硬编码值products
,现在该路由仅匹配从产品开始的传入URL,并保留其他任何内容以保持按预期路由链。
希望能为你清除它。