Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/apache-flex/4.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Asp.net mvc 3 如何在MVC路线中结合CatchAll和EndsWith?_Asp.net Mvc 3 - Fatal编程技术网

Asp.net mvc 3 如何在MVC路线中结合CatchAll和EndsWith?

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}将匹配最终节,无论它包含

以下路由将匹配BasePath下的任何文件夹结构:

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"