路由以反映ASP中的子目录结构.净MVC

本文关键字:子目录 结构 MVC ASP 路由 | 更新日期: 2023-09-27 18:18:48

目录类型结构的数据模型如下所示:

Folder:
   String Name
   Folder Parent
   List<File> Files
File
   Folder Parent
   Content

根级的文件和文件夹的父级为空。对于导航文件夹,我希望url看起来像这样:

http://mysite.com/directoryA/directoryB/directoryC/

我意识到这有一点冗余,但我觉得它具有更好的可读性,并且在这种情况下很有意义。使用默认路由,相同的文件夹看起来像:

http://mysite.com/Folder/directorycID

读起来不太好。是否有任何现有的模式可以执行这种类型的路由?使用名称而不是ID的问题是,我必须从根跟踪整个结构,因为名称只能保证在父目录中是唯一的。是否有一种路由类型可以给控制器一个目录列表,然后我可以在控制器中整理出关系?虽然工作量会大一些,但我能应付得来。

路由以反映ASP中的子目录结构.净MVC

不幸的是,. NET路由在ASP. NET上下文中。. NET MVC不能很好地处理任意数量的url段,比如folder1/folder2/folderN。你可以做一个全局路由:

...MapRoute(null, "{*folders}", 
    new { controller = "DirectoryStructure", action = "Parse"}
);

DirectoryStructureController。解析动作方法看起来像这样:

public ActionResult Parse(string folders) {...}

您可以拆分字符串以确定返回哪个内容,是否重定向到另一个操作,或者返回HttpNotFound。

上述方法的问题是,您的所有URL将被路由到DirectoryStructureController。您可以通过使用filesystem:

这样的前缀来消除这个问题。
...MapRoute(null, "file-system/{*folders}", 
    new { controller = "DirectoryStructure", action = "Parse"}
);

那么,请求将不会被路由到这个控制器,除非它们像这样带有/file-system前缀:

http://mysite.com/dirA/dirB/dirN/ <-- will not be routed
http://mysite.com/file-system/dirA/dirB/dirN/ <-- will be routed

更新2

我也刚刚意识到这个路由只适用于解析传入的URL。您将无法使用它来生成外发URL。