3

我看过一些关于导航和面包屑的帖子,但没有发现同样的问题。但是,如果有,请原谅并指出我。谢谢你。

我的情况 :

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}

其中为用户友好的 url 添加了interestareaname,并且只要您沿着层次结构向下移动,就会不断重复。然后输出将是: /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 功能。

使用站点地图时,我在显示详细信息页面时遇到了问题。因为这些书会同时出现在个人资料和兴趣上。有些书籍会出现在多个兴趣领域或个人资料中。在每一种情况下,我都想看看我用来读那本书的路径。

首先,我将每本书的详细信息页面添加到站点地图中,但这太疯狂了。并创建站点地图不能很好地处理的重复条目。另一个选项是通过查询字符串将列表页面上的路由数据传递到详细信息页面,但这看起来很糟糕,然后我必须添加逻辑来解析查询字符串以模仿面包屑,这将很难,因为我只有 ID 然后的最低级别。

我已经度过了很多个夜晚,但我仍然无法弄清楚。如果有人可以帮助或指出正确的方向,我将不胜感激。

4

1 回答 1

0

到目前为止,我为自己找到的唯一解决方案是实际创建所有可能的路线,例如:

        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 应用程序之前,添加一本新书不会创建节点。

因此,如果有其他建议,我很高兴看到它们。现在我可以继续内容,这就是最后的全部内容。

于 2012-02-09T19:44:09.587 回答