将路径传递给控制器​​操作

时间:2014-07-21 23:35:12

标签: c# asp.net asp.net-mvc

我想将路由传递给控制器​​操作。例如,如果我有控制器操作/Files/Index,我想将路由传递给控制器​​,例如/Files/some/path/here,以便我的Index操作选择/some/path/here。这可能吗?

public class FilesController : Controller
{
    public HttpResponseMessage Index(string route)
    {
        // `route` should contain everything 
        // after the controller action
    }
}

3 个答案:

答案 0 :(得分:3)

最直接的方法是使用像

这样的查询字符串
http://www.website.com/Home/Index?route=%2fFiles%2fsome%2fpath%2fhere

或作为动作链接中的参数

@Html.ActionLink("Go To Index", "Index", "Home", new {route= HttpUtility.HtmlEncode(/Files/some/path/here)}, null)

确保您转义上述/个字符

答案 1 :(得分:1)

是。指定自定义路线。

MVC4

routes.MapRoute(
    name: "Files",
    url: "Files/Index/{*route}"
);

MVC5

[Route("Files/Index/{*route}")]
public HttpResponseMessage Index(string route)
{
    // `route` should contain everything 
    // after the controller action
}

答案 2 :(得分:1)

您必须做的不仅仅是定义路线。

在RouteConfig.cs中:

public static void RegisterRoutes(RouteCollection routes)
{
    routes.RouteExistingFiles = true;

    routes.MapRoute(
        name: "FilePathRoute",
        url: "FilePath/Index/{*filePath}",
        defaults: new{ controller="FilePath", action="Index"});

此外,您必须告诉Web服务器不要拦截看起来像静态文件的URL。例如,在IIS Express中,清除preCondition属性:

<add name="UrlRoutingModule-4.0" type="System.Web.Routing.UrlRoutingModule"
     preCondition="" />

有了这个,路线就可以了:

FilePathController.cs:

using System.Web.Mvc;

namespace FilePathInUrl.Controllers
{
    public class FilePathController : Controller
    {
        // GET: FilePath
        public ActionResult Index(string filePath = "")
        {
            ViewBag.FilePath = filePath;
            return View();
        }
    }
}

查看/文件路径/ Index.cshtml:

@{
    Layout = null;
}

<!DOCTYPE html>

<html>
<head>
    <meta name="viewport" content="width=device-width" />
    <title></title>
</head>
<body>
    <h1>
    @ViewBag.Filepath
    </h1>
</body>
</html>

感谢Adam Freeman的"Pro ASP.NET MVC 4, Fourth Edition",ISBN 1-4302-4236-1;第13章,&#34; URL路由&#34;,标题&#34;磁盘文件的路由请求&#34;。使用那本书花了大约15分钟来构建这个答案。