2011-12-27 41 views
2

私はこのような何かに見えるディレクトリ型構造のためのデータモデルがあります:ルーティングASP.NET MVCでサブディレクトリ構造を反映する

Folder: 
    String Name 
    Folder Parent 
    List<File> Files 

File 
    Folder Parent 
    Content 

ファイルとルートレベルにフォルダがnullの親を持つことになります。私は、これは冗長性のビットを持って実現するが、私はそれがより良い可読性を持っていると感じており、この中に感覚の良い取引を行い

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

:フォルダをナビゲートするために、私は次のようになり、URLを持ってできるようにしたいと思います場合。既定のルートを使用すると、同じフォルダは次のようになります。

http://mysite.com/Folder/directorycID 

このタイプのルーティングを実行できる既存のパターンはありますか? IDの代わりに名前を使用する際の問題は、名前が親ディレクトリ内で一意にしか保証されないため、ルートから構造全体をトレースする必要があることです。コントローラにディレクトリのリストを与えることができるルートタイプがありますか?コントローラ内の関係を整理できますか?それはもう少し仕事ですが、私はそれに対処することができます。

+0

ディレクトリ構造はどの程度深いことができますか?限界はありますか? – danludwig

+0

どこにも制限はありません。現実的には5〜10レベルまで可能です。 – captncraig

答えて

3

残念ながら、ASP.NET MVCのコンテキストでのASP.NETルーティングは、folder1/folder2/folderNのような任意の数のURLセグメントではうまく動作しません。あなたはキャッチオールルートを行うことができます:

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

DirectoryStructureController.Parseアクションメソッドは次のようになります。

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

あなたが返すようにどのコンテンツを決定するために文字列を分割でき、別のアクションにリダイレクトするかどうか、またはHttpNotFoundを返します。

更新

上記のアプローチの問題は、あなたのURLのすべてがDirectoryStructureControllerにルーティングされるだろうということです。あなたは、ファイルシステムのような接頭辞を使用してこれを排除することができる:

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

その後、彼らはそうのような/ファイルシステムが付いた場合を除き、要求がこのコントローラーにルーティングされません。

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

アップデート2を

また、このルートは着信URLの解決にのみ有効であることもわかりました。送信URLを生成するためにそれを使用することはできません。

+0

私はリンクの生成について尋ねるつもりでした。私はおそらくヘルパーがフォルダから生成する必要があります。私は最初のものがうまくいくと思っています。それはそれが私のルートの最後になるので、それ以上のものは一致し、キャッチオールはまさにその通りです。 – captncraig

+0

はい、正確です。私はあなたがHtmlHelperでアウトゴーイングをすることができると言及するつもりでしたが、着信と着信のルートについてはあなたの質問に何もありませんでした。また、プロジェクトに応じて他の方法もあります。例えば、URLをビューモデルに入れることができます。接頭辞を使用する代わりにこれを最後のルート定義として使用する場合は、ルートフォルダがコントローラ名と一致しないように注意してください。それ以外の場合、ユーザーがホームフォルダを参照しようとすると、HomeControllerが取得されます。インデックスアクションメソッド。 – danludwig

+0

よろしくお願いいたします。プレフィックスは超々悪くはないでしょう。そして、それはそれらの厄介なエッジケースから私を保護します。 – captncraig

関連する問題