-1

Orchard CMS で新しいウィジェットを作成しています。これを行う方法は、最初にルートとコントローラーを追加し、ルートで定義された URL でコードを実行して機能を試すことです。たとえば、http://localhost:30320/Index My Routes.cs が設定されているため、この要求が指定されたコントローラーにルーティングされます。画面上で起こっています。これはすべて非常にうまく機能します。

結果に満足したので、これらすべてを新しいウィジェットに配置してみました。このために、ウィジェットを設定する新しい Migrations クラスを作成しました。これはかなり簡単で、これでウィジェットがホームページ レイヤーに追加されました。

私が遭遇しているのは、コントローラーがもう実行されていないことです。コントローラーを実行するように指定するルートを設定していないので、それほど奇妙ではありません。ビューが引き続き必要な情報を取得できるように、Controller ロジックを Driver メソッドに移動する必要があるのでしょうか。

現時点で持っているドライバーは次のようになります。

public class FrontpageDrivers : ContentPartDriver<FrontpageModelPart>
{
    protected override DriverResult Display(FrontpageModelPart part, string displayType, dynamic shapeHelper)
    {
        //return base.Display(part, displayType, shapeHelper);
        if (displayType.StartsWith("Detail"))
            return ContentShape("Parts_Index", () => shapeHelper.Parts_Index(
                                                                    LatestPostCollection: part.LatestPostCollection,
                                                                    TopRatedPostCollection: part.TopRatedPostCollection,
                                                                    TotalMonthCollection: part.TotalMonthCollection,
                                                                    ContentPart: part
                                                                    ));
        return null;
    }
}

実行する必要がある PartsController メソッドは次のようになります。

[HttpGet]
public ActionResult Detail()
{
    //Do something to get blogposts
    var getter = new GetBlogPost(_blogService, _blogPostService, _votingService);
    getter.Initialize();

    var latestPosts = getter.GetLatestPosts();
    var highestRankedPosts = getter.GetHighestRankedPosts();
    var archiveData = getter.GetTotalPostsPerMonth();

    var viewModel = new FrontpageModelPart();
    viewModel.LatestPostCollection = latestPosts;
    viewModel.TopRatedPostCollection = highestRankedPosts;
    viewModel.TotalMonthCollection = archiveData;

    return View("Index", viewModel);
}

メソッドの名前を Index と Detail に変更しようとしましたが、どちらもうまくいきません。表示されるビューは です/Views/Parts/Index.cshtml。ファイルに静的テキストを入れると、このビューが正しくレンダリングされていることがわかります。

では、コントローラーのロジックをドライバーに移動する必要がありますか、それともセットアップで何かを忘れていますか?

注: 配置、モジュール、移行、およびハンドラーは既に配置されています。

編集:このコードを使用している場合、すべてがうまく機能します:

protected override DriverResult Display(FrontpageModelPart part, string displayType, dynamic shapeHelper)
{
    var controller = new PartsController(Services, _blogService, _blogPostService, _votingService);
    part = controller.GetIndexViewModel();

    if (displayType.StartsWith("Detail"))
        return ContentShape("Parts_Index", () => shapeHelper.Parts_Index(
                                                                LatestPostCollection: part.LatestPostCollection,
                                                                TopRatedPostCollection: part.TopRatedPostCollection,
                                                                TotalMonthCollection: part.TotalMonthCollection,
                                                                ContentPart: part
                                                                ));
    return null;
}

これは非常にうまく機能しますが、私には「ハッキング」のように感じます...

4

1 に答える 1

0

コンテンツ ゾーンに表示されるすべてのものを引き継ぎたいが、形状の結果を返して、テーマやウィジェットなどを引き続きチャイムできるようにする場合は、コントローラーを使用します。それは、コントローラーができないことです。

于 2012-05-17T18:49:19.990 に答える