ASP.NET MVC 5: метод с одним контроллером для обработки путей в режиме файлового браузера

Я хочу иметь некоторый контроллер с единственным методом, который позволил бы мне перемещаться по некоторой иерархии (файловая система и т. Д.).

Другими словами, я хочу иметь возможность доступа к этому методу с гибкими маршрутами и получить часть маршрутов в качестве параметра. Например, в случае этой иерархии

Root
  Sub-folder-A
  Sub-folder-B
    Sub-folder-C

Я хочу иметь доступ к папкам со следующими маршрутами

mymvcapplication/explorer/root
mymvcapplication/explorer/root/sub-folder-a
mymvcapplication/explorer/root/sub-folder-b/sub-folder-c

Что и где я должен настроить, чтобы реализовать это правильно?

1 ответ

Решение

Чтобы поддерживать переменное число значений параметра url в URL запроса, вы можете пометить параметр вашего метода с помощью * префикс в определении маршрута.

С маршрутизацией атрибутов MVC,

[Route("explorer/root/{*levels}")]
public ActionResult Details(string levels = "")
{
    if (String.IsNullOrEmpty(levels))
    {
        //request for root
    }
    else
    {
        var levelArray = levels.Split('/');
        //check level array and decide what to do 
    }
    return Content("Make sure to return something valid :) ");
}

Последний параметр с префиксом * это как параметр catch-all, который будет хранить что-либо в URL после explorer/root

Поэтому, когда вы запрашиваете yoursite.com/explorer/root/a/b/c/d связыватель модели по умолчанию отобразит значение "a/b/c/d" к levels параметр. Вы можете позвонить Split метод для этой строки, чтобы получить массив сегментов URL.

Чтобы включить маршрутизацию атрибутов, перейдите к RouteConfig.cs и позвонить MapMvcAttributeRoutes() метод в RegisterRoutes,

public static void RegisterRoutes(RouteCollection routes)
{
    routes.IgnoreRoute("{resource}.axd/{*pathInfo}");

    routes.MapMvcAttributeRoutes();

    routes.MapRoute(
      name: "Default",
      url: "{controller}/{action}/{id}",
      defaults: new { controller = "Home", action = "Index", id = UrlParameter.Optional }  
    );
}
Другие вопросы по тегам