Asp.net mvc 3 如何在MVC路线中结合CatchAll和EndsWith?
以下路由将匹配BasePath下的任何文件夹结构:Asp.net mvc 3 如何在MVC路线中结合CatchAll和EndsWith?,asp.net-mvc-3,Asp.net Mvc 3,以下路由将匹配BasePath下的任何文件夹结构: http://BasePath/{*SomeFolders}/ 如何创建另一条与同一BasePath结构下的任何zip文件匹配的路由 我试过这个 http://BasePath/{*SomeFolders}/{ZipFile} 。。。但它与 包含多个节(如文字节或参数)的路径段不能包含“全部捕获”参数。 参数名称:routeUrl 我应该如何处理这个问题? *更新* 原来的要求实际上是有缺陷的。 {ZipFile}将匹配最终节,无论它包含
http://BasePath/{*SomeFolders}/
如何创建另一条与同一BasePath结构下的任何zip文件匹配的路由
我试过这个
http://BasePath/{*SomeFolders}/{ZipFile}
。。。但它与
包含多个节(如文字节或参数)的路径段不能包含“全部捕获”参数。
参数名称:routeUrl
我应该如何处理这个问题?
*更新*
原来的要求实际上是有缺陷的。
{ZipFile}将匹配最终节,无论它包含什么。(文件或文件夹)
事实上,我认为我想要匹配的路线模式应该是:
http://BasePath/{*SomeFolders}/{ZipFile}.zip
正如错误所说,catchall必须是路由中的最后一个参数 要获取ZipFile部分,您必须从SomeFolders catchall中解析它:
public ActionResult MyAction(string SomeFolders)
{
// parse the ZipFile out from the SomeFolders argument
}
因此,如果您有/folder1/folder2/folder3/file.zip,则可以执行以下操作:
var zipFile = SomeFolders.SubString(SomeFolders.LastIndexOf("/") + 1);
这里的答案似乎是约束
routes.MapRoute( _
"ViewFile", "BasePath/{*RestOfPath}", _
New With {.controller = "File", .action = "DownloadFile"}, _
New With {.RestOfPath = ".*\.zip"}
)
routes.MapRoute( _
"ViewFolder", "BasePath/{*RestOfPath}", _
New With {.controller = "Folder", .action = "ViewFolder"} _
)
或者对于那些喜欢C#的人来说
(呃,我想是的)
同一个路由注册了两次,第一个变体被赋予了额外的约束,RestOfPath参数应该以“.zip”结尾
据我所知,自定义约束也可以使用IRouteConstraint的派生项。捕获URL中的所有内容-这正是您所需要的
我编写了这样一个Route
类,它允许您完全按照您所描述的做。它允许您将“全部捕获”线段作为管线定义中的第一个线段(或任何其他实际位置)。它将允许您将路线定义为:
"BasePath/{*SomeFolders}/{ZipFile}"
整个过程非常详细地描述了在哪里可以找到这个Route
类的代码
附加信息
根据添加的信息,我仍然希望使用第一个管线定义,该定义不会将文件扩展名排除在管线段参数之外,而是为要添加的最后一个管段添加约束
"[a-zA-Z0-9_]+\.zip"
因此,路由的定义仍应如上所述,但ZipFile
的containt的定义应如前面所述。这将使我的特殊路线像现在这样开箱即用
为了使它也适用于其他路由定界符(如示例中的点),代码应该做相当大的更改,但如果您非常了解路由的工作原理,您可以将其更改为这种工作方式
但我还是建议你保持简单,增加一个约束。嗯,这是一个非常有趣的想法。我还没想到这个+1赞成。立即投票赞成这个想法。我今晚会试试这个,一旦确认,就把它标记为答案。很不错的。比我的答案更简洁:)我支持这一点,也比我的答案好得多。在实施了你的建议后,我已经确定,虽然它适用于原始问题,但我似乎在问题的措辞上犯了错误。我已更新了问题,以反映实际意图。根据更新后的要求,您的代码将停止工作,因为最后一段与正则表达式不匹配,并引发异常“路由URL无效”。@RoryBecker:您是否实际指向该确切位置上的现有物理文件?那为什么呢?为什么不让IIS返回请求的文件呢。有一个不在请求位置路由现有文件的设置。我实际上是在动态地重新路由。该文件实际上不在描述的位置,而是在另一个非常类似的位置,以后可能需要再次更改。我已经有很多系统指向这个url,所以我需要继续支持它。
"[a-zA-Z0-9_]+\.zip"