我看过一些有关导航和面包屑的帖子,但没有发现exaxt是同样的问题。但是,如果有,请原谅并指出。谢谢。
我的情况 :
Interests Profiles
| |
|_Interest Area 1 |-Profile Area 1
| | |
| |_Interest Area 1.1 |_List of Books
| | |
| |_List of Books |_Book Detail
| |
| |_Book Detail
|_Interest Area 2
|
|_List of Books
|
|_Book Detail
层次结构存储在数据库中。切入点兴趣和个人资料是固定的。从那里我不知道孩子们会是什么。
如果再也没有孩子,则根据最后选择的(子)类别的值检索书籍。
我这里有两个问题:
第一:创建适当的路线。我想要的方式是:
/books/{id}/{interestareaname}/{subinterestareaname}/{books}/{page}
在此处添加了interestareaname,用于用户友好的URL,并且只要您沿层次结构浏览,它就会不断重复。输出将是:
/ books / 1 / project-management / prince2 / books / 1
这将在分页列表页面1上显示prince2书籍。
但是,当只有一个级别时,该路线仅包含一个兴趣区名称,因此变为:
/book/{id}/{interestareaname}/{books}/{page}
我为解决问题1所做的工作:
routes.MapRoute(
"Details",
"view/details/{id}/{booktitle}",
new { controller = "book", action = "Details", id = "*", booktitle= "*"});
routes.MapRoute(
"interests",
"books/{id}/{level1}/{level2}/{level3}/{page}",
new { controller = "book", action = "books", level1 = "*", level2 = "*", level3 = "*", id = "0", page = UrlParameter.Optional }
);
routes.MapRoute(
"profiles",
"books/{id}/{level1}/{level2}/{level3}/{page}",
new { controller = "book", action = "books", level1 = "*", level2 = "*", level3 = "*", id = "0", page = UrlParameter.Optional }
);
我指出应该设置一个最大级别。那只是因为我不知道如何使它更具动态性。
现在的问题是区分兴趣类别和个人资料类别。我通过创建相同的路线但使用不同的名称来做到这一点,并在站点地图创建中添加了路线名称。
我遇到的第二个问题是站点地图和面包屑。
我使用MVCsitemapprovider和DynamicNodes功能。
使用站点地图时,我在显示详细信息页面时遇到问题。因为这些书会同时出现在个人资料和兴趣上。并且有些书会出现在多个兴趣领域或个人资料中。
在每种情况下,我都希望看到我以前去那本书的路径。
首先,我将每本书的详细页面添加到站点地图中,但这太疯狂了。并创建站点地图无法很好处理的重复条目。
另一个选择是通过querystring将列表页面上的routedata传递到详细信息页面,但这看起来很糟糕,然后我必须添加逻辑来解析querystring以模仿面包屑,这将很困难,因为我只有ID,然后最低级别的。
我已经住了很多晚,但仍然无法解决。如果有人可以帮助或指出正确的方向,我将非常感激。
最佳答案
到目前为止,我为自己找到的唯一解决方案是实际创建所有可能的路线,例如:
routes.MapRoute(
"interest",
"interest",
new { controller = "books", action = "viainterest"},
new { controller = "books", action = "viainterest" }
);
routes.MapRoute(
"interest_1_details",
"interest/{level1}/view/{id}/{booktitle}",
new { controller = "books", action = "detailsviainterest_1, level1 = "*", id = 0, booktitle = "*" },
new { controller = "books", action = "detailsviainterest_1" }
);
routes.MapRoute(
"interest2details",
"interest/{level1}/{level2}/view/{id}/{booktitle}",
new { controller = "books", action = "detailsviainterest_2", level1 = "*", level2 = "*", id = 0, booktitle = "*" },
new { controller = "books", action = "detailsviainterest_2" }
);
routes.MapRoute(
"interestlevel_1",
"interest/{id}/{level1}",
new { controller = "books", action = "viainterestlevel_1, level1 = "*", id = 0 },
new { controller = "books", action = "viainterestlevel_1"}
);
routes.MapRoute(
"interestlevel_2",
"interest/{id}/{level1}/{level2}",
new { controller = "books", action = "viainterestlevel_2", level1 = "*", level2 = "*", id = 0 },
new { controller = "books", action = "viainterestlevel_2}
);
//and so on for level 3 and for profiles etc.
在DynamicNodeManager中,我按层次结构添加所有类别,还添加所有项目。现在,我到整个详细信息页面都得到了不错的面包屑。而且,由于每个详细信息页的路径(路线数据和操作)不同,因此即使出现在多个类别中的书也显示正确的面包屑。
这解决了我的问题,但我仍然认为应该有更好的方法。当前解决方案的问题在于,由于还将添加到节点集合的详细信息,树将变得巨大。另一个缺点是该树是在应用程序启动时生成的。因此,添加一本书,直到我重置Web应用程序,才创建节点。
因此,如果还有其他建议,我很高兴看到它们。现在,我可以继续内容,到最后为止。
关于asp.net-mvc-3 - MVC3导航和面包屑-数据驱动,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/9136313/