【问题标题】:MVC 4.0 Routing IssueMVC 4.0 路由问题
【发布时间】:2015-08-08 09:39:47
【问题描述】:

我正在我的站点中构建一个自定义部分,它有多个路由,所以我的控制器设置如下:

  • 控制器 - ExportToExcel 操作
  • EomSpreasheet 参数
  • eomdate,siteid

在 routeconfig 中,我进行了以下设置。

routes.MapRoute(name: "EomCoverSheet",
url: "{controller}/{action}/{eomdate}/{siteid}",
defaults:
new
{
    controller = "ExcelExport",
    action = "EomSpreasheet",
    eomdate = UrlParameter.Optional,
    siteid= UrlParameter.Optional
});

当我调用控制器时,以及在我单步执行的代码中,eomdate 和 siteid 的值为 null。当我查看路由数据时,我可以看到动作和控制器,但参数是针对我在 routeconfig 文件中拥有的另一条路由。

我过去曾多次这样做,但这是我第一次看到这种行为,不知道如何解决它。如果您能提供任何帮助,我们将不胜感激。

【问题讨论】:

  • 您的路线注册顺序是什么?
  • 显示方法的签名以及调用方法的方式。还要注意,只有最后一个参数可以标记为UrlParameter.Optional(它会起作用,但如果你只提供一个参数,你的url将是...?eomdate=xxx&siteid=yyy而不是.../xxx/yyy

标签: asp.net-mvc


【解决方案1】:

关于 .NET 路由需要注意的两点是:

  1. 路由按照从第一个注册到最后一个的顺序执行,第一个匹配获胜。
  2. 路由标记(例如{controller})与 URL 段匹配任何内容,除非您对它们施加约束。

这意味着您发布的路线将匹配 任何 URL,其中包含 2、3 或 4 个段。如果您的默认路由已经与具有 0、1、2 或 3 个段的 any URL 匹配,则这不是很有用,因为您将有大量重叠并且取决于它们被声明的顺序,其中一个总是会覆盖另一个。

对此的一个实际解决方案是对路线段使用文字值,并将此路线放在更通用的路线之前。

routes.MapRoute(name: "EomCoverSheet",
url: "ExcelExport/{action}/{eomdate}/{siteid}",
defaults:
new
{
    controller = "ExcelExport",
    action = "EomSpreasheet",
    eomdate = UrlParameter.Optional,
    siteid= UrlParameter.Optional
});

这样做的目的是使该路由仅在 URL 以 ExcelExport 段开头并且还有 0、1、2 或 3 个段中包含任何内容时才匹配。

/ExcelExport/
/ExcelExport/EomSpreadsheet/
/ExcelExport/EomSpreadsheet/2015-01-01/
/ExcelExport/EomSpreadsheet/2015-01-01/123

如果您希望它只匹配包含所有 4 个分段的 URL,您可以将分段设为必需而不是可选。

routes.MapRoute(name: "EomCoverSheet",
url: "ExcelExport/{action}/{eomdate}/{siteid}",
defaults:
new
{
    controller = "ExcelExport"
});

现在路由将只匹配以 ExcelExport 开头的 4 段 URL。

/ExcelExport/EomSpreadsheet/2015-01-01/123

这个问题的另外两个可能的解决方案是:

  1. 使用areas
  2. 使用route constraints

【讨论】:

    猜你喜欢
    • 2011-07-31
    • 1970-01-01
    • 2016-11-09
    相关资源
    最近更新 更多