asp.net-mvc-3 – 如何在MVC路由中组合CatchAll和EndsWith?

前端之家收集整理的这篇文章主要介绍了asp.net-mvc-3 – 如何在MVC路由中组合CatchAll和EndsWith?前端之家小编觉得挺不错的,现在分享给大家,也给大家做个参考。
以下路由将匹配BasePath下面的任何文件夹结构:
http://BasePath/{*SomeFolders}/

如何创建另一个匹配同一BasePath结构下的任何zip文件的路由?

我试过这个……

http://BasePath/{*SomeFolders}/{ZipFile}

……但它错了

包含多个节的路径段(例如文字节或参数)不能包含catch-all参数.
参数名称:routeUrl

我该怎么做呢?

*更新*

原来的要求实际上是有缺陷的.
{ZipFile}将匹配最后一节,无论它包含什么. (文件文件夹)

实际上我相信我想要匹配的路线模式应该是:

http://BasePath/{*SomeFolders}/{ZipFile}.zip

解决方法

抓住URL中的任何位置 – 正是您所需要的

我写过这样的Route类,它允许你完全按照你描述的那样做.它允许您将catch-all段作为路径定义中的第一个段(或实际上的任何其他段).它允许您将路线定义为:

"BasePath/{*SomeFolders}/{ZipFile}"

整个过程在my blog post中有详细描述,您可以在这里找到此Route类的代码.

附加信息

基于添加的信息,我仍然宁愿使用不排除路径段参数之外的文件扩展名的第一个路由定义,而是为最后一个段添加约束

"[a-zA-Z0-9_]+\.zip"

所以路由仍然应该如上所述在我的答案中定义,但ZipFile的约束应该如前所述定义.这将使我的特殊路线像现在一样开箱即用.

为了使其适用于其他路由分隔符(如示例中的点),代码应该进行相当大的更改,但如果您知道路由的工作方式非常好,则可以将其更改为以这种方式工作.

但我宁愿建议你保持简单并添加约束.

猜你在找的asp.Net相关文章