【问题标题】:ASP.Net MVC Routing issue for Home controller家庭控制器的 ASP.Net MVC 路由问题
【发布时间】:2013-01-30 18:15:21
【问题描述】:

我创建了一个示例 Internet MVC 应用程序。然后使用 Index 视图创建 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 }
            );

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

【问题讨论】:

  • 如果您需要“ProdDef”仅在他们访问 /Products 时使用,则指定您只需要该路由:url:“Products/{name}/{id}/{action}” .否则,它会被用于每个请求,因为您没有指定控制器或名称,而是将 ID 和操作设为可选。

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


【解决方案1】:

将您的第一条路线更改为类似

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 但默认为指定索引
  • id:空

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

希望能为您解决问题。

【讨论】:

  • 谢谢,在这里等待更多解释,以便在 url 中写入 products/ 代替控制器和订购。
猜你喜欢
  • 2012-08-03
  • 2020-02-19
  • 2013-06-11
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2016-08-03
  • 2011-01-31
相关资源
最近更新 更多