Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/328.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# MVC路线可以处理的参数数量是否有限制?_C#_Asp.net Mvc 5_Routing - Fatal编程技术网

C# MVC路线可以处理的参数数量是否有限制?

C# MVC路线可以处理的参数数量是否有限制?,c#,asp.net-mvc-5,routing,C#,Asp.net Mvc 5,Routing,我正在使用MVC区域编写一个MVC应用程序。目前,我们的展示区采用以下路线: public override void RegisterArea(AreaRegistrationContext context) { context.MapRoute( "Display_default", "Display/{controller}/{action}/{id}/{id2}/{id3}/{*id4}", new { action = "Ind

我正在使用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路由是否对它可以映射到的参数数量有某种限制?我们还发现,如果我们将映射参数的数量缩减为id、id2和id3,那么当所有溢出连接到id3时,它将再次工作


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

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}/{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
Ok,那么在我上面的例子中,为什么它不允许我需要的6个参数呢?您是否删除了所有
UrlParameter.Optional
。为什么用
{*id6}
标记第6个?只有最后一个参数可以标记为
urlparmeter。可选的
@Stephen Muecke为什么这样认为?这些代码对我来说很好,你有任何文档吗?我已经调查了
routes.MapRoute
调用堆栈,我已经完成了
ParsedLote.Matched
方法行518,没有证据表明只有一个参数可以标记为
UrlParameter.Optional
。因为如果不提供所有参数,路由引擎无法知道哪个是哪个,因此使用的是查询字符串,而不是路由值(使路由定义毫无意义)。如果不提供所有这些值,路由引擎将根据url顺序获取它们。在这种情况下,如果您传递
Home/Index/1/2
,您将收到
id=1、id2=2、
,其他参数将为null。它的工作方式与使用一个参数时的工作方式相同,并且(对我来说也是毫无意义的)。如果2的值是用于
id3
(例如
@Html.ActionLink('xxx','Index','Home',new{id=1,id3=2},null)
,你需要花一些时间研究路由是如何工作的
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 }
 );