3

ナビゲーションとブレッドクラムに関するいくつかの投稿を見ましたが、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

階層はデータベースに保存されます。エントリポイントのインタレストとプロファイルは固定されています。そこから私は子供たちがどうなるかわかりません。

子がもう残っていない場合、最後に選択された(サブ)カテゴリの値に基づいて本が取得されます。

ここで2つの問題があります。1つ目:適切なルートを作成する。私が望む方法は次のとおりです。

/books/{id}/{interestareaname}/{subinterestareaname}/{books}/{page}

ここで、interestareanameはユーザーフレンドリーなURLに追加され、階層を下る限り繰り返され続けます。その場合、出力は次のようになります。/ books / 1 / project-management / prince2 / books / 1これは、ページングされたリストページのページ1にあるprince2の本を示しています。

ただし、レベルが1つしかない場合、ルートにはinterestareanameが1つしかないため、次のようになります。

/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 }
    );

最大レベルを設定する必要があると述べて、これに到達しました。それは私がそれをよりダイナミックにする方法を知らなかったからです。

ここでの問題は、関心カテゴリとプロファイルカテゴリを区別することです。同じルートを作成しましたが、名前を変えて、サイトマップの作成にルート名を追加しました。

私が抱えている2番目の問題は、サイトマップとブレッドクラムです。MVCsitemapproviderとDynamicNodes機能を使用しています。

サイトマップでは、詳細ページの表示に問題があります。なぜなら、本はプロフィールと興味の両方に表示されるからです。また、一部の本は複数の関心分野またはプロファイルに表示されます。いずれの場合も、その本にたどり着くまでの道のりを見たいと思います。

まず、各本の詳細ページをサイトマップに追加しましたが、それはおかしなことでした。また、サイトマップではうまく処理されない重複エントリを作成します。他のオプションは、クエリ文字列でリストページのルートデータを詳細ページに渡すことでしたが、それはひどく見えたので、クエリ文字列を解析してブレッドクラムを模倣するロジックを追加する必要があります。最低レベルの。

私は今何夜も過ごしましたが、それでも理解できません。誰かが私を助けたり正しい方向に向けたりしてくれるなら、私はとても感謝しています。

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で、すべてのカテゴリを階層的に追加し、すべてのアイテムも追加します。今、私は詳細ページまでずっとまともなブレッドクラムを手に入れました。また、各詳細ページのパス(ルートデータとアクション)が異なるため、いくつかのカテゴリに表示される本でも正しいブレッドクラムが表示されます。

これで私の問題は解決しましたが、もっと良い方法があるはずだと私はまだ考えています。現在のソリューションの問題は、ノードコレクションにも詳細アイテムが追加されるため、ツリーが大きくなることです。もう1つの欠点は、アプリケーションの開始時にツリーが生成されることです。したがって、新しい本を追加しても、Webアプリケーションをリセットするまで、ノードは作成されません。

それで、他に提案があれば、私はそれらを見てうれしいです。今のところ、私はコンテンツを続けることができます、それは最終的にすべてについてです。

于 2012-02-09T19:44:09.587 に答える