0

モジュールで定義されたビューをメインサイトのホームページ(〜/)にメインコンテンツとしてレンダリングしようとしています。ユーザーが認証されていない場合は、代わりにログイン/登録ビューを表示する必要があります。

ログインしたビューは1つのモジュール(製品モジュール)にあり、ログイン/登録ビューは別のモジュール(アカウントモジュール)にあります。ログインビューでは、ユーザーの製品に基づいてデータをフェッチするためのサービス呼び出しが必要です。私は現在、標準のMVCを使用してこれらのビューをレンダリングし、コントローラーで必要なデータをフェッチしています。

これは、これらのビューを形状テンプレートとして扱うことで実現できますか?もしそうなら、このようにホームページにビューを取り込む例はありますか?それとも、これを達成するためのより良い方法はありますか?

IHomePageProviderを実装して、Productモジュール内で自分のホームページViewResultを返すようにしましたが、成功しませんでした。

乾杯。

4

1 に答える 1

3

まず、ウィジェットとレイヤーを調べてみてください。認証されたユーザー用のレイヤーと匿名ユーザー用のレイヤーを定義し、それらのレイヤーにウィジェットをアタッチして、目的を達成することができます。これは、これを達成するための最良の方法かもしれません。これを行う方法の例については、Orchard のドキュメントを参照してください。

カスタムコントローラーと多くのカスタムロジックを使用する前に、同様のことを行いました。私の特定の要件のため、ウィジェットとレイヤーはこれには機能しません。ページ上のすべてのコンテンツは、いくつかの入力に応じて変更する必要があり、ウィジェットとレイヤーはこれにはあまり適していませんでした。私がしたことは、カスタムコントローラーと、対応する優先度の高いルートを作成することでした (したがって、ルートは、ホームページになりたい他のすべてよりも優先されます)。私は IHomePageProvider をまったくいじりませんでした。

コントローラー アクションで、必要なデータを取得し、必要な形状を作成して、次のような結果を返しました。return new ShapeResult(this, homePageShape);

homePageShapereturn ステートメントの直前で、次のように構成されます。

        // Create personalized home page shape: 
        var homeShape = _orchardServices.New.CustomHome(
            SomeShape1: someShape1
            , SomeShape2: someShape2
            , SomeModel1: someModel1
            ...
        );

これにより CustomHome という形状が作成され、orchard はモジュールのビュー フォルダーで CustomHome.cshtml というテンプレートを自動的に探します。

いくつかの形状を作成しました (上記のすべての「someShapeX」変数)。ほとんどの場合、BuildDisplay() メソッドを介してコンテンツ パーツから作成されます。コンテンツ パーツは IContentManager を使用してクエリされ、図形は次のように作成されます (この例はスライド ショーの図形です)。

        dynamic sliderShape = _contentManager.BuildDisplay(sliderPart, "Detail");

ユーザーがログインしているかどうかに応じて、コントローラーにロジックを配置して、必要な形状を作成できます。 CustomHome.cshtml では、次のような形状をレンダリングします。

        @Display(Model.SomeShape1)
于 2012-05-02T17:03:37.527 に答える