【问题标题】:Is there a limit on the number of parameters an MVC route can handle?MVC 路由可以处理的参数数量是否有限制?
【发布时间】:2017-10-26 19:35:56
【问题描述】:

我正在使用 MVC 区域编写 MVC 应用程序。目前我们的显示区域使用以下路线:

public override void RegisterArea(AreaRegistrationContext context) 
{
    context.MapRoute(
        "Display_default",
        "Display/{controller}/{action}/{id}/{id2}/{id3}/{*id4}",
        new { action = "Index", id = UrlParameter.Optional , id2 = UrlParameter.Optional, id3 = UrlParameter.Optional }
    );
}

这很有效。然而,我们发现需要一个带有 6 个参数的控制器动作:

public ActionResult _MyMethod(string id, string id2, string id3, string id4, string id5, string id6)

我们发现我们可以将其添加到当前设置中,但是 URL 中第四个 id 之后的任何参数都只是连接到第四个 id 参数中。

我们尝试扩展路由以接受我们需要的参数数量,如下所示:

public override void RegisterArea(AreaRegistrationContext context) 
{
    context.MapRoute(
        "Display_default",
        "Display/{controller}/{action}/{id}/{id2}/{id3}/{id4}/{id5}/{*id6}",
        new { action = "Index", id = UrlParameter.Optional , id2 = UrlParameter.Optional, id3 = UrlParameter.Optional }
    );
}

但是,使用此路由不再加载页面。

MVC 路由对于它可以映射到的参数数量是否有某种 CAP?我们还发现,如果我们将映射参数的数量缩小为 id、id2 和 id3,它会再次工作,但所有溢出连接到 id3。

有人知道这方面的信息吗?

【问题讨论】:

  • 您可以拥有任意多个(直到超出查询字符串限制并引发异常)。但是只有最后一个参数可以标记为UrlParameter.Optional
  • 好的,那么在我上面的例子中,为什么它不允许我需要的 6 个参数?
  • 你删除了所有的UrlParameter.Optional。为什么你用{*id6}标记第6个?

标签: c# asp.net-mvc-5 routing


【解决方案1】:

ASP.NET MCV 对参数数量没有限制。

你的情况

public override void RegisterArea(AreaRegistrationContext context) 
{
   context.MapRoute(
      "Display_default",
      "Display/{controller}/{action}/{id}/{id2}/{id3}/{id4}/{id5}/{*id6}",
       new { action = "Index", id = UrlParameter.Optional , id2 = UrlParameter.Optional, id3 = UrlParameter.Optional }
   );
}

变量 id 是可选的,但 id4 是强制性的。您必须在末尾添加可选参数。

喜欢

 routes.MapRoute(
      name: "Default",
      url: "{controller}/{action}/{id5}/{id6}/{id}/{id2}/{id3}/{*id4}",
            defaults: new { controller = "Home", action = "Index", id = UrlParameter.Optional, id2 = UrlParameter.Optional, id3 = UrlParameter.Optional, id4 = UrlParameter.Optional, id5 = UrlParameter.Optional , id6 = UrlParameter.Optional }
);

或将所有参数设为可选

routes.MapRoute(
      name: "Default",
      url: "{controller}/{action}/{id}/{id2}/{id3}/{id4}/{id5}/{*id6}",
            defaults: new { controller = "Home", action = "Index", id = UrlParameter.Optional, id2 = UrlParameter.Optional, id3 = UrlParameter.Optional, id4 = UrlParameter.Optional, id5 = UrlParameter.Optional }
 );

【讨论】:

  • 只有最后一个参数可以标记为UrlParameter.Optional
  • @Stephen Muecke 为什么你这么认为?这些代码对我来说很好用,你有任何文档吗?我调查了routes.MapRoute调用堆栈,我已经完成了ParsedRoute.Matched方法dotnetframework.org/default.aspx/4@0/4@0/DEVDIV_TFS/Dev10/…第518行没有证据表明只有一个参数可以标记为UrlParameter.Optional
  • 因为如果你不提供所有这些,路由引擎无法知道哪个是哪个,因此使用查询字符串,而不是路由值(使路由定义毫无意义)
  • 如果你不提供所有的,路由引擎会按照url的顺序来取。在这种情况下,如果您传递Home/Index/1/2,您将收到id = 1, id2 = 2,,其他参数将为空。它的工作方式与使用一个参数相同,并且(对我来说同样毫无意义)。
  • 如果 2 的值是 id3(例如 @Html.ActionLink('xxx', 'Index', 'Home', new { id = 1, id3 = 2 }, null) - 你需要花一些时间研究路由的工作原理
猜你喜欢
  • 2017-04-06
  • 2011-06-09
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2020-06-13
相关资源
最近更新 更多