ASP.NET MVC 5:在文件浏览器模式下处理路径的单一控制器方法

时间:2016-01-03 03:40:19

标签: asp.net-mvc asp.net-mvc-5 mvcroutehandler

我想让一些控制器使用单一方法,允许我浏览某个层次结构(文件系统等)。

换句话说,我希望能够通过灵活的路径访问此方法,并将路径的一部分作为参数。例如,在此层次结构的情况下

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 个答案:

答案 0 :(得分:1)

要在请求网址中支持可变数量的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 参数,该参数会在explorer/root

因此,当您请求yoursite.com/explorer/root/a/b/c/d时,默认模型绑定器会将值"a/b/c/d"映射到levels参数。您可以在该字符串上调用Split方法以获取一组网址段。

要启用属性路由,请转到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 }  
    );
}