我看过一些有关导航和面包屑的帖子,但没有发现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/

10-13 02:32