.net 具有相同模式但不同命名段的URL路由

.net 具有相同模式但不同命名段的URL路由,.net,asp.net-mvc,asp.net-mvc-4,asp.net-mvc-routing,.net,Asp.net Mvc,Asp.net Mvc 4,Asp.net Mvc Routing,假设我为我的新ASP.NET MVC应用程序定义了以下两条路由: {controller}/{action}/{id} {controller}/{action}/{page} 除最后命名的管段外,两条管线具有相同的精确模式。最后命名的段也是可选的,在例子中不清楚,但是考虑它们是可选的。 如果我将列出的顺序中的路由添加到框架的RouteCollection,则第一个路由将始终与如下URL匹配:/Home/Index/1 通常这不是问题,但ASP.NET MVC的默认模型绑定器在将参数作为参数

假设我为我的新ASP.NET MVC应用程序定义了以下两条路由:

  • {controller}/{action}/{id}
  • {controller}/{action}/{page}
除最后命名的管段外,两条管线具有相同的精确模式。最后命名的段也是可选的,在例子中不清楚,但是考虑它们是可选的。 如果我将列出的顺序中的路由添加到框架的
RouteCollection
,则第一个路由将始终与如下URL匹配:
/Home/Index/1

通常这不是问题,但ASP.NET MVC的默认模型绑定器在将参数作为参数传递给动作时,要求动作的参数与路由模式中的命名段具有相同的名称

因此,对于一个动作
列表
,例如,我想将一个模型列表拉到接受页码作为参数的视图中,我需要将该参数命名为id。同样正常情况下,这不是问题,但我是一个详细的家伙,我喜欢我的参数名称来指示参数的用途

但是由于模型绑定器在路由系统之后启动,我就不走运了。还是我?有没有办法不用写我自己的模型活页夹,或者更糟糕的是,不用写我自己的路由器

此外,这可以看作是第二个相关问题,如何确保路由命名段是重构安全的

例如,在我的视图中使用
Url.Action
,是受鼓励的,因为它们考虑了路由。但要在使用此方法生成URL时传递参数,通常必须传入一个匿名对象,该对象的属性名称也等于命名的段


因此,如果我重命名管线中的命名段,我实际上必须转到所有视图并重命名该属性。这听起来并不理想。那么,有什么干净的方法可以解决这个问题呢?

对于传入的请求,
RouteCollection
将选择正则表达式逻辑匹配的第一个
路由

不幸的是,我确实认为你在这么高的层次上是不走运的


但是,如果您加入某种约束,您可能能够摇摆您的方式来匹配第二条路线。

您将需要类似于
“/{id}”的等价物。其中(id是整数)
或类似的东西。我很确定ASP.NETMVC不支持这一点。(很高兴在我自己的极简路由器中知道这个功能很有用)@Earlz我很确定我可以为路由添加一个正则表达式约束,以确保命名的段是一个整数。但这在我的例子中没有意义,因为
{id}
{page}
都应该/可以是整数。我现在明白你的问题了(我的路由器仍在处理,但在MVC-heh中无法工作)。因此,您基本上希望某些
操作
解析为页码,而其他操作解析为ID?@Earlz很抱歉回复太晚。基本上,我要问的是,默认模型绑定器是否有办法将路由中的参数绑定到参数,而不管它们的名称如何。因此,例如,
{controller}/{action}/{id}
的路由可以调用和绑定像
List(int?page)
Get(int?id)
这样的操作。框架将检测到路由有一个可选参数,它解析为的操作也有一个可选参数。我不必显式地给那个参数一个与命名段相等的名称,我试了一下,然后等着看是否有其他人有意见。就像你说的,我在这件事上运气不好。我将继续探索它,但现在我将标记这是正确的答案。谢谢你的帮助。