asp.net mvc树路径的复杂路由

12 asp.net-mvc asp.net-mvc-routing

我想知道如何定义这样的路由映射:

{TreePath}/{Action}{Id} 
Run Code Online (Sandbox Code Playgroud)

TreeMap是从数据库动态加载的,如下所示:

 'Gallery/GalleryA/SubGalleryA/View/3'
Run Code Online (Sandbox Code Playgroud)

chr*_*166 13

您可以创建自定义路由处理程序来执行此操作.实际路线是一个全能的:

routes.MapRoute(
    "Tree",
    "Tree/{*path}",
    new { controller = "Tree", action = "Index" })
        .RouteHandler = new TreeRouteHandler();
Run Code Online (Sandbox Code Playgroud)

树处理程序查看路径,将最后一部分提取为操作,然后重定向到控制器.动作部分也从路径中删除.添加{id}部分应该很简单.

public class TreeRouteHandler : IRouteHandler
{
    public IHttpHandler GetHttpHandler(RequestContext requestContext)
    {
        string path = requestContext.RouteData.Values["path"] as string;

        if (path != null)
        {
            int idx = path.LastIndexOf('/');
            if (idx >= 0)
            {
                string actionName = path.Substring(idx+1);
                if (actionName.Length > 0)
                {
                    requestContext.RouteData.Values["action"] = actionName;
                    requestContext.RouteData.Values["path"] = 
                        path.Substring(0, idx);
                }
            }
        }

        return new MvcHandler(requestContext);
    }
}
Run Code Online (Sandbox Code Playgroud)

您的控制器然后按预期工作:

public class TreeController : Controller
{
    public ActionResult DoStuff(string path)
    {
        ViewData["path"] = path;
        return View("Index");
    }
}
Run Code Online (Sandbox Code Playgroud)

现在你可以调用URL了/Tree/Node1/Node2/Node3/DoStuff.动作获得的路径是Node1/Node2/Node3


wom*_*omp 2

可以换一下网址吗?如果您可以将 {TreePath} 参数作为最后一个参数,则可以通过一条路由轻松完成此操作。

   routes.MapRoute("TreeRoute", 
                    "{Action}/{id}/{*TreePath}", 
                    new TreeRouteHandler()));
Run Code Online (Sandbox Code Playgroud)

但通配符包罗万象的参数必须是最后一个参数。

否则,我认为您将不得不定义多个参数,其中一个参数与 TreeMap URL 的每个可能部分相匹配。

请注意,如果两个路由参数之间没有文字文本,则永远无法一起定义它们。换句话说,你可以定义{Action}/{Id},但你永远无法定义{Action}{Id}。当模式匹配时,路由引擎无法知道一个参数在哪里结束以及下一个参数在哪里开始。