【问题标题】:asp.net mvc complex routing for tree path树路径的asp.net mvc复杂路由
【发布时间】:2009-06-21 05:05:42
【问题描述】:

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

{TreePath}/{Action}{Id} 

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

 'Gallery/GalleryA/SubGalleryA/View/3'

【问题讨论】:

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


    【解决方案1】:

    您可以创建一个自定义路由处理程序来执行此操作。实际路线是包罗万象的:

    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 这样的URL。动作获取的路径是Node1/Node2/Node3

    【讨论】:

    • 树字还是有噪音,谢谢
    • 如果您不喜欢 womp 的工作,自定义路由处理程序绝对是您的选择。您不必像克里斯概述的那样明确设置“树”控制器......我认为基本思想是您可以使用自定义路由处理程序做任何您想做的事情。
    【解决方案2】:

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

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

    不过,通配符 catchall 参数必须是最后一个参数。

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

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

    【讨论】:

    • 我想没有别的办法了。 {Action}/{id}/{*TreePath} 不是很漂亮的 URL。还是谢谢
    【解决方案3】:

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

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

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

    它不能开箱即用,但需要自定义路由。您可以找到关于该主题的精彩文章,包括代码 here

    【讨论】:

      【解决方案4】:

      我是 MVC 的新手,但其中一个要求是此选项。我是一个 vb-er,所以我在转换代码时遇到了一些麻烦,但让它工作并想贡献一个示例解决方案: www.proovit.com/Download/MvcApplication1.zip 这是一个简单的标准 MVC 项目,我将代码和 bin 目录放在了外面,但您可以从标准项目中复制它们。

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

      【讨论】:

        猜你喜欢
        • 2013-11-20
        • 1970-01-01
        • 2016-02-11
        • 1970-01-01
        • 1970-01-01
        • 2015-09-20
        • 2011-12-22
        • 2011-02-26
        • 1970-01-01
        相关资源
        最近更新 更多