0

我创建了一个示例 Internet MVC 应用程序。然后使用索引视图创建 ProductsController。

然后在路由中,我使用以下路由规则将产品 url 映射到 products/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 }
            );

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

4

1 回答 1

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}。它们的格式相同,只是参数名称不同。

以下是给定 URL(例如/Home/Index.

第一条路线将首先尝试,有 4 个参数,其中 2 个是可选的,因此如果它们不存在,则不会给出任何值,为您留下以下值:

  • 控制器:首页
  • 名称:索引
  • action : null 但将默认为指定的索引
  • 身份证:空

如您所见,两个非可选参数都已填充,因此路由将匹配,但不会像您预期的那样运行。无论 URL 是什么,同样的事情都会发生,只要它具有controllerand的值name。这让我想到了我原来的答案,如果您希望第一个路由匹配产品的传入 URL,您需要添加一些允许路由处理程序区分它的内容。通过用{controller}硬编码值替换products,现在该路由将仅匹配以产品开头的传入 URL,留下任何其他内容继续按预期沿着路由链向下传递。

希望能为您解决问题。

于 2013-01-30T18:19:42.063 回答