Asp.net mvc 2 子类别路线mvc 2?

Asp.net mvc 2 子类别路线mvc 2?,asp.net-mvc-2,asp.net-mvc-routing,Asp.net Mvc 2,Asp.net Mvc Routing,嗨,我有个问题想弄明白,我简直疯了。我有这样一个场景。类别,类别子类别,类别子类别子类别 我一辈子都想不出这条路。我的最后和现在是这样的 routes.MapRoute( "Navigation", "Navigation/{nav}/{sub}/{subsub}/{id}", new { controller = "Navigation", action = "Site", nav = UrlParameter.Opt

嗨,我有个问题想弄明白,我简直疯了。我有这样一个场景。类别,类别子类别,类别子类别子类别

我一辈子都想不出这条路。我的最后和现在是这样的

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或sub,但它会将system.UrlParameter.Optional作为参数放在那里。关于如何处理这个问题有什么想法吗

编辑1:

到目前为止,我把网站限定为2个子类,并做了3条路线和3个行动结果。这不是一个很好的解决方案,但目前仍然有效

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

考虑以下URL:

Navigation/1
Navigation/1/2

在不含糊的情况下,很难说要将
1
2

绑定到哪一个路由参数,这是不可能的。在管线定义中只能有一个可选参数,此参数应始终是管线中的最后一个参数。否则,路由引擎无法消除路由之间的歧义,并且此规则已在ASP.NET MVC 3中强制执行。这意味着
nav
sub
subsub
不能是可选的。您需要始终为这些参数提供一个值

考虑以下URL:

Navigation/1
Navigation/1/2

如果您不想使用单独的quesy字符串参数,而不是在路由中使用单个类别参数并传递多个逗号分隔的值,那么就不可能不含糊地说出要绑定到哪个路由参数
1
2

例如,url/Navigation/1,2,3

将转换为具有一个字符串参数“category”的操作,您可以通过逗号拆分该参数来获得:

category: 1
sub-cat: 2
sub-sub-cat: empty
sub-sub-sub-cat: 3
这将允许您更改子类别的数量,而无需重新定义路由


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

如果您不希望使用单独的quesy字符串参数,请在路由中使用单个类别参数并传递多个逗号分隔的值

例如,url/Navigation/1,2,3

将转换为具有一个字符串参数“category”的操作,您可以通过逗号拆分该参数来获得:

category: 1
sub-cat: 2
sub-sub-cat: empty
sub-sub-sub-cat: 3
这将允许您更改子类别的数量,而无需重新定义路由


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

我同意@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 = "" }
);

我同意@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 = "" }
);

通过欺骗一点,把它简化成一条路线

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}除了显示类别路径之外,这里没有任何函数,如果我需要打破它,我将使用字符串拆分器。

通过作弊将其剪切为一条路径

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}除了显示类别路径之外,这里没有任何函数,如果我需要打破它,我将使用字符串拆分器。

我的选项是什么?还有别的办法吗?MVC不可能完成子类别/页面,这在ie上是很常见的事情,甚至在普通的网站上也是如此site@Dejan,您无法处理路由中的那些。您可以使用查询字符串参数,例如:
Navigation?nav=1&subsubsub=2
。好的,查询字符串url在此网站上不是一个选项。我刚刚找到了类似导航/{*sub}的东西,我需要探索更多的方法。哦,也许这就是查询选项?@Dejan,你想做的是不可能的。考虑下面的URL:<代码>导航/A/B < /代码>。你能从中分辨出是
nav=“a”,sub=“b”,subsub=”“
,还是
nav=“”,sub=“a”,subsub=“b”
,还是
nav=“a”,sub=“”,subsub=“b”
?你不能。路由引擎也没有。您所指的
Navigation/{*sub}
被称为“一网打尽”路线,这意味着您可以使用以下控制器操作
public ActionResult Foo(string sub){…}
并在该操作中
sub=“1/2”
,但您仍然无法消除路线的歧义。所以我建议你重新思考你在这里真正想做什么。在这种情况下,当你有子类别时,你会怎么做?我的选择是什么?还有别的办法吗?MVC不可能完成子类别/页面,这在ie上是很常见的事情,甚至在普通的网站上也是如此site@Dejan,您无法处理路由中的那些。您可以使用查询字符串参数,例如:
Navigation?nav=1&subsubsub=2
。好的,查询字符串url在此网站上不是一个选项。我刚刚找到了类似导航/{*sub}的东西,我需要探索更多的方法。哦,也许这就是查询选项?@Dejan,你想做的是不可能的。考虑下面的URL:<代码>导航/A/B < /代码>。你能从中分辨出是
nav=“a”,sub=“b”,subsub=”“
,还是
nav=“”,sub=“a”,subsub=“b”
,还是
nav=“a”,sub=“”,subsub=“b”
?你不能。路由引擎也没有。您所指的
Navigation/{*sub}
被称为“一网打尽”路由,这意味着您可以拥有以下控制器操作
public ActionResult Foo(string sub){…}