2011-12-27 83 views
2

我有一个目录式结构的数据模型,看起来是这样的:在根级别路由,以反映子目录结构在ASP.NET MVC

Folder: 
    String Name 
    Folder Parent 
    List<File> Files 

File 
    Folder Parent 
    Content 

文件和文件夹将有一个null父。对于浏览文件夹我希望能有网址看起来像:

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

我意识到这有一点冗余的,但我觉得它有更好的可读性,使的感觉一个很好的协议在此案件。使用默认路线,相同的文件夹将如下所示:

http://mysite.com/Folder/directorycID 

这看起来不太好。是否有任何现有模式可以执行此类路由?使用名称而不是ID的问题是我必须从根目录跟踪整个结构,因为名称只能在父目录中保证唯一。有没有可以给控制器一个目录列表的路由类型,并且我可以理清控制器中的关系?这将会多一点工作,但我可以解决这个问题。

+0

你的目录结构有多深?有限制吗? – danludwig 2011-12-27 15:12:50

+0

无限制在任何地方编码。实际上最多可能达到5-10个等级。 – captncraig 2011-12-27 15:16:15

回答

3

不幸的是,ASP.NET MVC上下文中的ASP.NET路由对于任意数量的url段(如folder1/folder2/folderN)不起作用。你可以做一个包罗万象的路线:然后

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

DirectoryStructureController.Parse操作方法是这样的:

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

你可以分割字符串,以确定要返回的内容,是否重定向到另一个动作,或者返回HttpNotFound。

更新

与上述方法的问题是,所有的URL将被路由到DirectoryStructureController。

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

UPDATE2:除非他们与/文件系统,像这样的前缀

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

然后,请求将不会被路由到该控制器:您可以通过使用前缀像文件系统消除这种

我也刚刚意识到这条路线只会解析传入的URL。您将无法使用它来生成传出网址。

+0

我要问关于生成链接。我可能需要一个帮助器从文件夹中生成一个。我认为第一个会起作用,它只是我的最后一条路线,所以任何高于此的路线都会匹配,而且所有的东西都是这样。 – captncraig 2011-12-27 15:35:49

+0

是的。我想提到你可以用HtmlHelper进行支出,但是在你的问题中没有任何关于传入和传出路由的问题。另外,根据您的项目可能还有其他方法 - 例如,您可以将URL放入视图模型中。如果您将此作为最后一个路由定义而不是使用前缀,请注意您的根文件夹都不匹配任何控制器名称。否则,当用户尝试浏览到Home文件夹时,他们将获得您的HomeController。索引操作方法。 – danludwig 2011-12-27 15:40:53

+0

哎哟。前缀不会超级差,并且它会保护我免受这些讨厌的边缘情况的影响。 – captncraig 2011-12-27 15:49:07