我想将路由传递给控制器操作。例如,如果我有控制器操作/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
}
}
答案 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)
是。指定自定义路线。
routes.MapRoute(
name: "Files",
url: "Files/Index/{*route}"
);
[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="" />
有了这个,路线就可以了:
using System.Web.Mvc;
namespace FilePathInUrl.Controllers
{
public class FilePathController : Controller
{
// GET: FilePath
public ActionResult Index(string filePath = "")
{
ViewBag.FilePath = filePath;
return View();
}
}
}
@{
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分钟来构建这个答案。