家庭控制器的ASP.Net MVC路由问题

时间:2013-01-30 18:15:21

标签: asp.net-mvc asp.net-mvc-routing

我创建了一个示例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 }
            );

但在此之后,联系页面会将我重定向到主索引控制器操作。 ??为什么这样?我是否遗漏了一些内容,以及在为产品创建一条规则后其他操作为什么停止工作。

1 个答案:

答案 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条是可选的,因此如果它们不存在则不会给出任何值,只留下以下值:

  • controller:主页
  • 名称:索引
  • action:null但默认为指定的索引
  • id:null

正如您所看到的,两个非可选参数都已填充,因此路径将匹配,但不会像您预期的那样运行。无论URL是什么,只要它具有controllername的值,就会发生同样的事情。这让我想到了我的原始答案,如果您希望第一条路线匹配产品的传入URL,您需要添加一些允许路由处理程序区分它的东西。通过将{controller}替换为硬编码值products,现在该路由仅匹配从产品开始的传入URL,并保留其他任何内容以保持按预期路由链。

希望能为你清除它。