子类别路由mvc 2?

时间:2011-01-29 15:15:19

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

嗨我有一个问题想弄明白,我真的很疯狂。我有这样的场景。 Category,Category-SubCategory,Category-SubCategory-SubSubCategory

我不能为我的生活弄清楚这条路线。我的最后和当前是这样的

routes.MapRoute(
            "Navigation", 
            "Navigation/{nav}/{sub}/{subsub}/{id}", 
            new { controller = "Navigation", action = "Site", nav = UrlParameter.Optional, sub = UrlParameter.Optional, subsub = UrlParameter.Optional, id = UrlParameter.Optional }
        );

我想这样,UrlParameter.Optional会跳过sub或subub,而是将system.UrlParameter.Optional作为参数放在那里。关于如何处理这个问题的任何想法?

编辑1:
到目前为止,我限制了2个子类别的网站,并做了3个路线和3个行动结果。不是一个漂亮的解决方案,但现在适用

4 个答案:

答案 0 :(得分:1)

这是你不能拥有的一个场景。路径定义中只能有一个可选参数,此参数应始终是路径中的LAST参数。否则,路由引擎无法消除路由之间的歧义,并且此规则已在ASP.NET MVC 3中强制执行。这意味着navsubsubsub不能是可选的。您需要始终为这些参数提供值。

请考虑以下网址:

Navigation/1
Navigation/1/2

如果不明确指出要绑定12的路由参数,就不可能这么说。

答案 1 :(得分:0)

如果您不想使用单独的quesy字符串参数,而不是在路线中使用单个类别参数,并传递多个以逗号分隔的值。

例如,网址 / Navigation / 1,2 ,, 3

将转换为带有一个字符串参数“category”的操作,您可以用逗号分割得到:

category: 1
sub-cat: 2
sub-sub-cat: empty
sub-sub-sub-cat: 3

这样您就可以在不重新定义路线的情况下更改子类别的数量。

PS。您可能希望使用不会在类别名称中使用的其他字符而不是逗号。

答案 2 :(得分:0)

我同意@Darin您可能想要更多地考虑一下您的架构,但我相信这一系列路线对您有用:

 routes.MapRoute(
    "Navigation", 
    "Navigation/{nav}/{sub}/{subsub}/{id}", 
    new { controller = "Navigation", action = "Site", nav = "", sub = "", subsub = "", id = UrlParameter.Optional } 
);

routes.MapRoute(
    "Navigation", 
    "Navigation/{nav}/{sub}/{subsub}", 
    new { controller = "Navigation", action = "Site", nav = "", sub = "", subsub = UrlParameter.Optional, id = "" }
);

routes.MapRoute(
    "Navigation", 
    "Navigation/{nav}/{sub}", 
    new { controller = "Navigation", action = "Site", nav = "", sub = UrlParameter.Optional, subsub = "", id = "" }
);

routes.MapRoute(
    "Navigation", 
    "Navigation/{nav}", 
    new { controller = "Navigation", action = "Site", nav = UrlParameter.Optional, sub = "", subsub = "", id = "" }
);

答案 3 :(得分:0)

通过作弊将它切成一条路线。

routes.MapRoute(
            "navigation",
            "{nav}/{name}",
            new { controller = "Navigation", action = "Page", nav = UrlParameter.Optional, name = UrlParameter.Optional }
        );

我在导航中写下所有类别,子类别

<%: Html.ActionLink("HOME", "Page", "Navigation", new { nav = "Category/Sub/", name = "Name" }, null)%>

我认为{nav}除了显示类别路径之外没有真正得到任何功能,如果需要打破它,请使用字符串拆分器。