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

时间:2009-06-21 05:05:42

标签: asp.net-mvc asp.net-mvc-routing

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

{TreePath}/{Action}{Id} 

TreeMap是从这样的数据库动态加载的:

 'Gallery/GalleryA/SubGalleryA/View/3'

4 个答案:

答案 0 :(得分:13)

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

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

树处理程序查看路径,将最后一部分提取为操作,然后重定向到控制器。动作部分也从路径中删除。添加{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);
    }
}

然后你的控制器就像你期望的那样工作:

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

现在您可以调用/Tree/Node1/Node2/Node3/DoStuff之类的网址。操作获取的路径为Node1/Node2/Node3

答案 1 :(得分:2)

你可以切换网址吗?如果您可以将{TreePath}参数作为最后一个参数,则可以使用一条路径轻松完成此操作。

   routes.MapRoute("TreeRoute", 
                    "{Action}/{id}/{*TreePath}", 
                    new TreeRouteHandler()));

但通配符catchall参数必须是最后一个参数。

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

请注意,如果没有一些文字文本,则永远不能同时定义两个路由参数。换句话说,您可以定义{Action}/{Id},但您可以从不定义{Action}{Id}。路由引擎无法知道一个参数何处结束,而下一个参数在模式匹配时开始。

答案 2 :(得分:2)

你可以在查询字符串中包含“贪婪”部分,只要你可以在其后面有固定部分,例如

/{*TreePath}/Edit/{id}
/{*TreePath}/Action/{id}

请注意,上述路径中的操作不可变,因为贪婪的部分需要以某个字面值停止(其他正斜杠)。如果你只在你的“树”上执行一些操作,我会工作但如果你有很多动作会很麻烦,因为每个人都需要自己的路径条目。

它不会开箱即用,但需要自定义路线。你可以找到关于这个主题的精彩写作,包括代码here

答案 3 :(得分:1)

我是MVC的新手,但其中一个要求就是这个选项。我是一个vb er,所以我在转换代码时遇到了一些麻烦,但是让它工作想要提供一个示例解决方案:     www.proovit.com/Download/MvcApplication1.zip 这是一个简单的标准MVC项目,我留下了代码和bin dirs,但你可以从标准项目中复制它们。

o,您必须使用标签app / bla / bla / bla作为订单页面的索引和app / trade / order / view。