C# MVC路线可以处理的参数数量是否有限制?
我正在使用MVC区域编写一个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
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 }
);