Cha*_*nce 10 asp.net-mvc routing routes
我试图想出一种创建"动态"路由的方法.我的意思是,我希望能够为每次命中分配路径的控制器和动作,而不是直接映射它.
例如,路径可能看起来像这个"path/{object}",并且当该路径被命中时,执行查找以提供适当的控制器/动作来调用.
我已经尝试过发现创建自定义路由处理程序的机制,但文档/可发现性目前有点阴暗(我知道,它的测试版 - 我不会再期待了).虽然,我不确定这是否是最好的方法,也许是控制器工厂,甚至是执行所有映射的默认控制器/动作可能是最好的路线(没有双关语意).
任何意见,将不胜感激.
您始终可以使用包罗万象的语法(我不知道该名称是否正确)。
路线:
routeTable.MapRoute(
"Path",
"{*path}",
new { controller = "Pages", action = "Path" });
控制器动作定义为:
public ActionResult Path(string path)
在控制器的操作中,您将有一条路径,因此只需将其溢出并进行分析即可。
要调用另一个控制器,您可以使用 RedirectToAction (我认为这是更合适的方法)。通过重定向,您可以为其设置永久重定向。或者使用类似的东西:
internal class MVCTransferResult : RedirectResult
{
public MVCTransferResult(string url) : base(url)
{
}
public MVCTransferResult(object routeValues)
: base(GetRouteURL(routeValues))
{
}
private static string GetRouteURL(object routeValues)
{
UrlHelper url = new UrlHelper(
new RequestContext(
new HttpContextWrapper(HttpContext.Current),
new RouteData()),
RouteTable.Routes);
return url.RouteUrl(routeValues);
}
public override void ExecuteResult(ControllerContext context)
{
var httpContext = HttpContext.Current;
// ASP.NET MVC 3.0
if (context.Controller.TempData != null &&
context.Controller.TempData.Count() > 0)
{
throw new ApplicationException(
"TempData won't work with Server.TransferRequest!");
}
// change to false to pass query string parameters
// if you have already processed them
httpContext.Server.TransferRequest(Url, true);
// ASP.NET MVC 2.0
//httpContext.RewritePath(Url, false);
//IHttpHandler httpHandler = new MvcHttpHandler();
//httpHandler.ProcessRequest(HttpContext.Current);
}
}
Run Code Online (Sandbox Code Playgroud)
然而,此方法需要在 IIS 或 IIS Express 上运行 Casinni 不支持 Server.Transfer 方法
归档时间: |
|
查看次数: |
7372 次 |
最近记录: |