2012-10-31 42 views
0

所以我们可以说我已经为我的很酷的新ASP.NET MVC应用程序定义了以下两条路线:URL路由采用相同的模式,但不同的命名片段

  • {controller}/{action}/{id}
  • {controller}/{action}/{page}

两个除了最后一个命名段以外,路线具有相同的确切模式。最后命名的片段也是可选的 - 在这个例子中不清楚,但认为它们是可选的。

如果我加入我列出了他们的框架的RouteCollection订单的路线,第一路线会一直匹配的网址是这样的:/Home/Index/1

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

因此,对于例如一个动作List,在这里我想拉的机型列表,以传递给视图,它接受一个页码作为参数,我需要命名参数ID。通常情况下,这不是一个问题,但我是一个详细的人,我喜欢我的参数名称来指示参数用于什么。

但是由于模型绑定器在路由系统之后进入,所以我很失败。还是我?有没有办法解决这个问题,而不写我自己的模型绑定器,或者更糟的是,我自己的路由器?

另外,这可以被认为是第二个相关的问题,我如何确保路由命名段是重构安全的?

使用Url.Action,例如,在我的观点是鼓励,因为他们考虑到路线。但是在使用此方法生成URL时传递参数时,通常必须传入一个匿名对象,其名称也等于指定段的属性。

所以,如果我在我的路线中重命名段,我实际上必须去我所有的视图,并重命名该属性。这听起来并不理想。那么干净的解决方法是什么?

+0

你需要类似''/{id}".Where(id是整数)'或类似的东西。我很确定ASP.Net MVC不支持。 (很高兴在我自己的简约路由器中知道这个功能很有用) – Earlz

+0

@Earlz我很确定我可以向路由添加一个REGEX约束来确保指定的段是一个整数。但在我的例子中这是没有意义的,因为'{id}'和'{page}'应该可以是整数。 – 9ee1

+0

啊,我明白了。我现在明白你的问题了(我的路由器仍然处理它,但不会在MVC中工作)。所以你基本上想要某些'行动'解决页码和其他人解决id? – Earlz

回答

1

在传入的请求上,RouteCollection将选择正则表达式逻辑匹配的第一个Route

不幸的是,我确实认为你在如此高层次的观点上运气不佳。

但是,如果您放入某种限制,您可能会摆动以匹配第二条路线。

+0

好吧,我给了它一个镜头,等待看看其他人是否有意见。看起来我就像你说的那样,在这方面运气不好。我会继续探索它,但现在我会将其标记为正确的答案。谢谢你的帮助。 – 9ee1

相关问题