Маршрутизация для отражения структуры подкаталогов в ASP.NET MVC - PullRequest
2 голосов
/ 27 декабря 2011

У меня есть модель данных для структуры типов каталогов, которая выглядит примерно так:

Folder:
   String Name
   Folder Parent
   List<File> Files

File
   Folder Parent
   Content

Файлы и папки на корневом уровне будут иметь нулевого родителя.Для навигации по папкам я хотел бы иметь URL, которые выглядят примерно так:

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

Я понимаю, что это немного избыточно, но я чувствую, что оно лучше читается и имеет много смыслав этом случае.При использовании маршрутов по умолчанию эта же папка будет выглядеть следующим образом:

http://mysite.com/Folder/directorycID

, что выглядит не так хорошо.Существуют ли какие-либо шаблоны, которые могут выполнять этот тип маршрутизации?Проблема с использованием имен вместо идентификаторов заключается в том, что мне придется отслеживать всю структуру от корня, поскольку имена гарантированно уникальны только в родительском каталоге.Есть ли тип маршрута, который может просто дать контроллеру список каталогов, и я могу разобраться в отношениях в контроллере?Было бы немного больше работы, но я мог бы справиться с этим.

1 Ответ

3 голосов
/ 27 декабря 2011

К сожалению, маршрутизация ASP.NET в контексте ASP.NET MVC не слишком хорошо работает с произвольным числом сегментов URL, таких как folder1 / folder2 / folderN.Вы можете сделать универсальный маршрут:

...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"}
);

Тогда запросы не будут перенаправляться на этот контроллер, если они не имеют префикс / 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.

...